30/09/2018, 21:43

Hỏi về tính trừu tượng trong c#

mọi người có thể giải thích một cách đơn giản nhất nó là gì có được không vậy
mình có đoạn code sau đây

using System;
namespace PolymorphismApplication
{
   abstract class Shape
   {
      public abstract int area();
   }
   class Rectangle:  Shape
   {
      private int length;
      private int width;
      public Rectangle( int a=0, int b=0)
      {
         length = a;
         width = b;
      }
      public override int area ()
      { 
         Console.WriteLine("Rectangle class area :");
         return (width * length); 
      }
   }

   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle(10, 7);
         double a = r.area();
         Console.WriteLine("Area: {0}",a);
         Console.ReadKey();
      }
   }
}

có hai dòng mình chưa được hiểu lắm à

abstract public int Area();

tác dụng của hàm này để làm gì vậy
dòng thứ 2 là :

public Rectangle( int a=0, int b=0)
      {
         length = a;
         width = b;
      }

cái này để làm gì vậy mọi người mình cảm ơn

Khiem Nguyen viết 23:47 ngày 30/09/2018

Ví dụ bạn có 2 class là Rectangle class và Square class cả hai đều cùng có phương thức tính diện tích, nhưng công thức tính diện tích của hình vuông và hình chữ nhật sẽ khác nhau nên dẫn đến việc bạn sẽ phải khai báo một phương thức trừu tượng để dùng cho cả hai class trên public abstract int area(); bạn nhìn code bên dưới sẽ hiểu rõ hơn

namespace AbstractClass
{
    abstract class Shape
    {
        public abstract int area();
    }
    class Rectangle : Shape
    {
        private int length;
        private int width;

        public Rectangle(int a = 0, int b = 0)
        {
            length = a;
            width = b;
        }

        public override int area()
        {
            Console.WriteLine("Rectangle class area :");
            return (length * width);
        }
    }

    class Square : Shape
    {
        private int with;

        public Square(int a = 0)
        {
            with = a;
        }

        public override int area()
        {
            Console.WriteLine("Square class area :");
            return (with * with);
        }
    }
}




public class Program
{
      public static void Main(string[] args)
      {
            Rectangle rectangle = new Rectangle(5, 10);
             double rectangleArea = rectangle.area();
             Console.WriteLine("Area: {0}", rectangleArea);

             Square square = new Square (5);
             double squareArea = square.area();
             Console.WriteLine("Area: {0}", squareArea);
      }      
 }

Như bạn đã thấy thì cả 2 hai class Rectangle và Square đều có nhu cầu tính diện tích nhưng cách tính diện tích của mỗi class sẽ khác nhau. Rectangle = length * width. còn với Square thì tính chất của nó là 4 cạnh bằng nhau nên công thức là Square = width * width

Đoạn code này:

 public Rectangle(int a = 0, int b = 0)
 {
    length = a;
    width = b;
 }

đơn giản chỉ là bạn khai báo 2 biến length và width và khởi tạo một Constuctor để truyền tham số vào 2 biến đó. Khi đó ở class program bạn chỉ việc khởi tạo đối tượng và truyền vào những tham số với giá trị cụ thể

Rectangle rectangle = new Rectangle(5, 10);

nghĩa là lúc này length = 5 và width = 10

Murakami viết 23:43 ngày 30/09/2018


Bạn ghé những bài học này để rõ hơn nhé

Đỗ Nhiên viết 23:45 ngày 30/09/2018

tức là một method sẽ có nhiều chức năng đúng không anh theo ý em hiểu nó cứ như là hàm rỗng ý bao giờ cần dùng thì minh lại viết chức năng cho hàm đó anh nhỉ

Khiem Nguyen viết 23:50 ngày 30/09/2018

bạn cứ tạm hiểu là … ví dụ máy bay trực thăng và máy bay phản lực. Cả 2 đều có chức năng chung là bay. nhưng cách bay của mỗi loại máy bay sẽ khác nhau. Trực thăng thì bay thẳng lên không cần lấy đà, còn máy bay phản lực cần phải lấy đà trên đường băng trước khi bay.

Làm như vậy bạn chỉ cần mở rộng một phương thức có sẵn là “bay” cho các class con. Giả sử sau này bạn có thêm class tên lửa thì cách bay tên lửa cũng sẽ khác, vì thể abstract class sinh ra để làm như vậy. Viết 1 lần dùng cho nhiều class con có cùng chức năng nhưng có thể mở rộng phương thức đó phù hợp với từng đặc tính của lớp con đó.

Sáng Béo viết 23:49 ngày 30/09/2018

a cho e hỏi tính trừu tượng là như thế này, vậy nếu đa hình thì như thế nào ạ?
Cũng là cùng phương thức nhưng khác tham số truyền vào ạ?

Khiem Nguyen viết 23:46 ngày 30/09/2018

giải thích tường tận thì khá mất thời gian, trên mạng cũng có nhiều bài viết nói về abstract class và interface. Bạn tham khảo ở đây https://yinyangit.wordpress.com/2012/01/15/oop-interface-vs-abstract-class/

Bài liên quan
0