Virtual – Abstract – C# | ungdunglaptrinh

**  Phương thức trừu tượng abstract thì không có phần cài đặt (Không có thân hàm), yêu cầu lớp con phải cài đặt lại. Phương thức ảo thì đã tồn tại sẳn cài đặt, lớp con có thể cài đặt lại hoặc không tùy vào nhu cầu.

Sự khác nhau:

  1. Virtual cho phép lớp Con không nhất thiết phải tạo Override cho method Virtual ở lớp Cha. Ngược lại Abstract thì bắt buộc.
Abstract Class Cha 
{
....
public virtual void AAA() { }
public abstract void BBB() ;
....
}

Class Con : Cha
{
....
public override void AAA() { } // có thể không cần hàm này 
public override void BBB() { } // buộc có.
....
}

2. cách khai báo, method Virtual có các hàm bên trong còn Abstract thì không.

public virtual void AAA() { code here }
public abstract void BBB() ;

3. method abstract phải nằm trong một class abstract, còn virtual có thể nằm trong lớp thường hoặc lớp abstract, ..

Abstract Class Cha 
{
public abstract void BBB() ;
}

Vi dụ:

Class Product

class Product {
    protected double price = 0;

    // Phương thức ảo ProductInfo
    public virtual void ProductInfo() {
        Console.WriteLine($"Giá sản phẩm {price}");
    }

    public void TestProduct()
    {
        this.ProductInfo();
    }
}

Class Iphone

class Iphone : Product {
    public Iphone() {
        price = 500;
    }
    public override void ProductInfo() {
        Console.WriteLine($"Điện thoại Iphone");
        base.ProductInfo();  // gọi lại hàm ở base
    }
}
Product  p = new Iphone();
p.TestProduct();
// Điện thoại Iphone
// Giá sản phẩm 500

Lớp Iphone đã định nghĩa lại phương thức ProductInfo, nên các lời gọi đến ProductInfo là hoàn toàn khác với định nghĩa ban đầu của nó. Tuy nhiên, nếu muốn thi hành code của hàm mà do lớp cơ sở định nghĩa thì bạn cần gọi đến nó thông qua ký hiệu base.