Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Khác biệt giữa hàm virtual và abstract trong C#

Abstract method: Không có thân hàm (implementation), bắt buộc lớp dẫn xuất override. Chỉ khai báo trong abstract class.

Virtual method: Có thân hàm mặc định, lớp dẫn xuất có thể override (tùy chọn). Có thể nằm trong class thường hoặc abstract class.

Ví dụ Virtual Function

using System;

namespace PolymorphismApplication
{
    class Shape
    {
        protected int width, height;
        public Shape(int a = 0, int b = 0) { width = a; height = b; }
        public virtual int Area()
        {
            Console.WriteLine("Lớp cơ sở Area:");
            return 0;
        }
    }

    class Rectangle : Shape
    {
        public Rectangle(int a = 0, int b = 0) : base(a, b) { }
        public override int Area()
        {
            Console.WriteLine("Lớp Rectangle Area:");
            return width * height;
        }
    }

    class Triangle : Shape
    {
        public Triangle(int a = 0, int b = 0) : base(a, b) { }
        public override int Area()
        {
            Console.WriteLine("Lớp Triangle Area:");
            return width * height / 2;
        }
    }

    class Caller
    {
        public void CallArea(Shape sh)
        {
            int a = sh.Area();
            Console.WriteLine("Diện tích: {0}", a);
        }
    }

    class Tester
    {
        static void Main(string[] args)
        {
            Caller c = new Caller();
            Rectangle r = new Rectangle(10, 7);
            Triangle t = new Triangle(10, 5);
            c.CallArea(r);
            c.CallArea(t);
            Console.ReadKey();
        }
    }
}

Kết quả

Lớp Rectangle Area:
Diện tích: 70
Lớp Triangle Area:
Diện tích: 25

Ví dụ Abstract Function

using System;

public abstract class Vehicle
{
    public abstract void Display();
}

public class Bus : Vehicle
{
    public override void Display() { Console.WriteLine("Bus"); }
}

public class Car : Vehicle
{
    public override void Display() { Console.WriteLine("Car"); }
}

public class Motorcycle : Vehicle
{
    public override void Display() { Console.WriteLine("Motorcycle"); }
}

public class MyClass
{
    public static void Main()
    {
        Vehicle v;
        v = new Bus(); v.Display();
        v = new Car(); v.Display();
        v = new Motorcycle(); v.Display();
    }
}

Kết quả

Bus
Car
Motorcycle

Tóm tắt: abstract = bắt buộc override, không có code. virtual = có code mặc định, override tùy chọn.