Đa hình trong C#
Phương pháp đa hình và ghi đè
Đa hình có nghĩa là "nhiều dạng" và nó xảy ra khi chúng ta có nhiều lớp có liên quan với nhau bằng tính kế thừa.
Giống như chúng tôi đã chỉ ra ở chương trước; Kế thừa cho phép chúng ta kế thừa các trường và phương thức từ một lớp khác. Đa hình sử dụng những phương pháp đó để thực hiện các nhiệm vụ khác nhau. Điều này cho phép chúng ta thực hiện một hành động theo nhiều cách khác nhau.
Ví dụ, hãy nghĩ về một lớp cơ sở có tên Animal
có một phương thức gọi là animalSound()
. Các lớp Động vật có nguồn gốc có thể là Lợn, Mèo, Chó, Chim - Và chúng cũng có cách triển khai âm thanh động vật riêng (tiếng lợn kêu và tiếng mèo kêu, v.v.):
Ví dụ
class Animal // Base class (parent) { public void animalSound() { Console.WriteLine("The animal makes a sound"); } } class Pig : Animal // Derived class (child) { public void animalSound() { Console.WriteLine("The pig says: wee wee"); } } class Dog : Animal // Derived class (child) { public void animalSound() { Console.WriteLine("The dog says: bow wow"); } }
Hãy nhớ trong chương Kế thừa rằng chúng ta sử dụng ký hiệu :
để kế thừa từ một lớp.
Bây giờ chúng ta có thể tạo các đối tượng Pig
và Dog
và gọi phương thức animalSound()
trên cả hai đối tượng:
Ví dụ
class Animal // Base class (parent) { public void animalSound() { Console.WriteLine("The animal makes a sound"); } } class Pig : Animal // Derived class (child) { public void animalSound() { Console.WriteLine("The pig says: wee wee"); } } class Dog : Animal // Derived class (child) { public void animalSound() { Console.WriteLine("The dog says: bow wow"); } } class Program { static void Main(string[] args) { Animal myAnimal = new Animal(); // Create a Animal object Animal myPig = new Pig(); // Create a Pig object Animal myDog = new Dog(); // Create a Dog object myAnimal.animalSound(); myPig.animalSound(); myDog.animalSound(); } }
Đầu ra sẽ là:
The animal makes a sound
The animal makes a sound
The animal makes a sound
Không phải kết quả tôi đang tìm kiếm
Kết quả từ ví dụ trên có thể không như bạn mong đợi. Đó là bởi vì phương thức của lớp cơ sở sẽ ghi đè phương thức của lớp dẫn xuất khi chúng có cùng tên.
Tuy nhiên, C# cung cấp một tùy chọn để ghi đè phương thức của lớp cơ sở, bằng cách thêm từ khóa virtual
vào phương thức bên trong lớp cơ sở và bằng cách sử dụng từ khóa override
cho từng phương thức của lớp dẫn xuất:
Ví dụ
class Animal // Base class (parent) { public virtual void animalSound() { Console.WriteLine("The animal makes a sound"); } } class Pig : Animal // Derived class (child) { public override void animalSound() { Console.WriteLine("The pig says: wee wee"); } } class Dog : Animal // Derived class (child) { public override void animalSound() { Console.WriteLine("The dog says: bow wow"); } } class Program { static void Main(string[] args) { Animal myAnimal = new Animal(); // Create a Animal object Animal myPig = new Pig(); // Create a Pig object Animal myDog = new Dog(); // Create a Dog object myAnimal.animalSound(); myPig.animalSound(); myDog.animalSound(); } }
Đầu ra sẽ là:
The animal makes a sound
The pig says: wee wee
The dog says: bow wow
Tại sao và khi nào nên sử dụng "Kế thừa" và "Đa hình"?
- Hữu ích cho khả năng sử dụng lại mã: sử dụng lại các trường và phương thức của một lớp hiện có khi bạn tạo một lớp mới.