Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

ความแตกต่างระหว่าง Virtual และ Abstract Method ใน C#


ภาพรวม

ทั้งคู่ใช้สำหรับ Polymorphism (พอลิมอร์ฟิซึม) แต่มีความแตกต่างสำคัญ:

คุณสมบัติVirtual MethodAbstract Method
Implementationมี implementation ใน base classไม่มี implementation (แค่ signature)
OverrideOptional (เลือก override ได้)บังคับ (derived class ต้อง override)
Class Typeอยู่ใน class ธรรมดา หรือ abstract classอยู่ใน abstract class เท่านั้น
InstantiationBase class สร้าง instance ได้Abstract class สร้าง instance ไม่ได้
Keywordvirtualabstract

Virtual Method Example

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("Parent class area:");
            return 0;
        }
    }
    class Rectangle : Shape
    {
        public Rectangle(int a = 0, int b = 0) : base(a, b) { }
        public override int Area()
        {
            Console.WriteLine("Rectangle class area");
            return width * height;
        }
    }
    class Triangle : Shape
    {
        public Triangle(int a = 0, int b = 0) : base(a, b) { }
        public override int Area()
        {
            Console.WriteLine("Triangle class area:");
            return width * height / 2;
        }
    }
    class Caller
    {
        public void CallArea(Shape sh)
        {
            int a = sh.Area();
            Console.WriteLine("Area: {0}", a);
        }
    }
    class Tester
    {
        static void Main()
        {
            Caller c = new Caller();
            c.CallArea(new Rectangle(10, 7));
            c.CallArea(new Triangle(10, 5));
        }
    }
}

ผลลัพธ์

Rectangle class area
Area: 70
Triangle class area:
Area: 25

Abstract Method Example

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 = new Bus(); v.Display();
        v = new Car(); v.Display();
        v = new Motorcycle(); v.Display();
    }
}

ผลลัพธ์

Bus
Car
Motorcycle

แนวทางเลือกใช้

  • Virtual: มีพฤติกรรมพื้นฐาน (default behavior) ให้ derived class เลือก override หรือไม่
  • Abstract: บังคับ derived class ต้อง implement (contract) - ใช้เมื่อ base class ไม่มี implementation ที่สมเหตุสมผล