ภาพรวม
ทั้งคู่ใช้สำหรับ Polymorphism (พอลิมอร์ฟิซึม) แต่มีความแตกต่างสำคัญ:
| คุณสมบัติ | Virtual Method | Abstract Method |
|---|---|---|
| Implementation | มี implementation ใน base class | ไม่มี implementation (แค่ signature) |
| Override | Optional (เลือก override ได้) | บังคับ (derived class ต้อง override) |
| Class Type | อยู่ใน class ธรรมดา หรือ abstract class | อยู่ใน abstract class เท่านั้น |
| Instantiation | Base class สร้าง instance ได้ | Abstract class สร้าง instance ไม่ได้ |
| Keyword | virtual | abstract |
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 ที่สมเหตุสมผล