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.