This article is currently in the process of being translated into Vietnamese (~96% done).
Abstract classes
Lớp trừu tượng, được nhận biết bởi từ khóa abstract trong định nghĩa của class, được dùng để định nghĩa lớp cơ sở trong phân cấp. Vậy có gì đặc biệt, đó là bạn không thể tạo ra thể hiện của lớp trừu tượng - nếu bạn cố thì bạn sẽ có lỗi biên dịch. Thay vì vậy, bạn phải tạo ra lớp con, như đã nói trong bài về thừa kế và tạo ra một thể hiện của lớp con. Vì vậy khi nào bạn muốn một lớp trừu tượng? Nó phụ thuộc vào những gì bạn muốn làm.
Thực tế, bạn có thể không cần lớp trừu tượng, nhưng chúng rất hữu ích trong một số tình huống, như trong framework, đó là tại sao bạn có thể thấy có lớp trừu tượng trong .NET framework. Một nguyên tắc ở đây là tên phải dễ hiểu để mô tả cái gì đó trừu tượng, là định nghĩa hơn là thứ gì đó thực sự.
Trong ví dụ này, chúng ta sẽ tạo ra lớp cơ sở cho động vật có chân và sau đó tạo ra lớp Dog, được thừa kế từ nó như sau:
namespace AbstractClasses
{
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Console.WriteLine(dog.Describe());
Console.ReadKey();
}
}
abstract class FourLeggedAnimal
{
public virtual string Describe()
{
return "Not much is known about this four legged animal!";
}
}
class Dog : FourLeggedAnimal
{
}
}
Nếu bạn so sánh với ví dụ ở chương trước thì bạn sẽ không thấy sự khác biệt quá lớn. Thực tế, từ khóa abstract trước định nghiaw FourLeggedAnimal. Như bạn thấy, chúng ta tạo ra thể hiện mới của lớp Dog và sau đó gọi phương thức Describe() từ lớp FourLeggedAnimal. Bây giờ chúng ta sẽ tạo ra một thể hiện của lớp FourLeggedAnimal:
FourLeggedAnimal someAnimal = new FourLeggedAnimal();
Bạn sẽ gặp lỗi biên dịch:
Cannot create an instance of the abstract class or interface 'AbstractClasses.FourLeggedAnimal'
Bây giờ bạn có thể thấy, chúng ta chỉ thừa kế phương thức Describe() nhưng không hữu ích lắm. Hãy ghi đè:
class Dog : FourLeggedAnimal
{
public override string Describe()
{
return "This four legged animal is a Dog!";
}
}
Trong trường hợp này, chúng ta ghi đè hoàn toàn nhưng trong một số trường hợp bạn có thể chỉ dùng chức năng trong lớp cơ sở để thêm vào tình năng mới. Nó có thể hoàn thành bằng cách dùng từ khóa base liên quan đến lớp mà chúng ta thừa kế:
abstract class FourLeggedAnimal
{
public virtual string Describe()
{
return "This animal has four legs.";
}
}
class Dog : FourLeggedAnimal
{
public override string Describe()
{
string result = base.Describe();
result += " In fact, it's a dog!";
return result;
}
}
Giờ rõ ràng, bạn có thể tạo ra một lớp con của lớp FourLeggedAnimal - có lẽ một con mèo hay con sư tử? Trong chương tiếp theo, chúng ta sẽ làm thêm một số ví dụ nâng cao và giới thiệu về phương thức trừu tượng.