Chủ Nhật , 25 Tháng Mười 2020
Trang chủ / HỌC LẬP TRÌNH / C# [C Sharp] / [Học lập trình] – C# – [Bài 28] (C#) – Đa hình trong C#

[Học lập trình] – C# – [Bài 28] (C#) – Đa hình trong C#

Tính đa hình trong C# (Polymorphism)


Đa hình và nạp chồng phương thức

Đa hình có nghĩa là “nhiều dạng”, nó xảy ra khi chúng ta có nhiều lớp liên quan với nhau theo thừa kế.

Như chúng ta đã học ở bài trước; Thừa kế – Inheritance cho phép chúng ta thừa kế các trường và các phương thức từ lớp khác. Đa hình – Polymorphism sử dụng các phương thức để thực hiện các công việc khác nhau. Điều này cho phép chúng ta thực hiện một hành động đơn lẻ theo các cách khác nhau.

Ví dụ, chúng ta có lớp cơ sở là Animal, có phương thức animalSound(). Các lớp dẫn xuất của Animals có thể là Pigs, Cats, Dogs, Birds – và chúng cũng có phương thức của riêng mình:

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");
  }
}

Bây giờ chúng ta có thể tạo các đối tượng Pig, Dog và gọi phương thức animalSound() trên cả hai đối tượng này:

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();
  }
}

Kết quả sẽ là:

The animal makes a sound
The animal makes a sound
The animal makes a sound

Chạy ví dụ »

Không phải kết quả chúng ta mong muốn

Kết quả từ ví dụ trên có thể không như những gì chúng ta mong đợi. Đó là vì phương thức của lớp cở sở đã nạp chồng phương thức của lớp dẫn xuất, khi chúng chia sẻ cùng một tên.

Tuy nhiên, C# cung cấp một tùy chọn để nạp chồng phương thức của lớp cơ sở, bằng cách thêm từ khóa virtual tới phương thức bên trong lớp cơ sở, và bằng cách thêm từ khóa override cho các phương thức của mỗi 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();
  }
}

Kết quả sẽ là:

The animal makes a sound
The pig says: wee wee
The dog says: bow wow

Chạy ví dụ »

Tại sao và khi nào chúng ta sử dụng “Inheritance” và “Polymorphism”?

– Hữu dụng cho khả năng tái sử dụng mã nguồn: tái sử dụng các trường và các phương thức của một lớp đã tồn tại khi chúng ta tạo một lớp mới.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *