Tính đa hình trong C#

0
506

Đa hình có nhiều hình thức về nghĩa. Trong mô hình lập trình hướng đối tượng, đa hình thường được hiểu là “một giao diện, nhiều chức năng”.

Đa hình có thể là tĩnh hoặc động. Trong đa hình tĩnh, sự đáp lại với một chức năng được xác định tại thời gian biên dịch. Trong đa hình năng động, nó được quyết định tại thời gian chạy.

Đa hình tĩnh

Cơ chế liên kết một hàm với một đối tượng trong thời gian biên dịch được gọi là ràng buộc đầu. Nó cũng được gọi là ràng buộc tĩnh. C # cung cấp hai kỹ thuật để thực hiện đa hình tĩnh. Đó là:

  • Nạp chồng hàm
  • Nạp chồng toán tử

Chúng ta sẽ nghiên cứu nạp chồng toán tử ở bài viết sau.

Nạp chồng hàm

Bạn có thể có nhiều định nghĩa cho các hàm cùng tên trong cùng một phạm vi. Các định nghĩa của hàm phải khác nhau về loại hoặc số lượng của các đối số trong danh sách đối số. Bạn không có thể nạp chồng hàm mà chỉ khác nhau bởi kiểu trả về.

Ví dụ sau đây cho thấy cách sử dụng hàm printf() để in các loại dữ liệu khác nhau:

using System;
namespace PolymorphismApplication
{
   class Printdata
   {
      void print(int i)
      {
         Console.WriteLine("In so nguyen: {0}", i );
      }

      void print(double f)
      {
         Console.WriteLine("In so thuc: {0}" , f);
      }

      void print(string s)
      {
         Console.WriteLine("In chuoi: {0}", s);
      }
      static void Main(string[] args)
      {
         Printdata p = new Printdata();
         
         // GOI HAM IN SO NGUYEN
         p.print(5);
         
         // GOI HAM IN SO THUC
         p.print(500.263);
         
         // GOI HAM IN CHUOI
         p.print("Hello C++");
         Console.ReadKey();
      }
   }
}
When

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:

In so nguyen: 5
In so thuc: 500.263
In chuoi: Hello C++

Đa hình động

C # cho phép bạn tạo các lớp trừu tượng được sử dụng để đóng góp một phần cho lớp hoàn chỉnh. Các lớp trừu tượng chứa các phương thức trừu tượng, được thực hiện bởi các lớp dẫn xuất. Các lớp dẫn xuất có chức năng chuyên biệt hơn.

Dưới đây là các quy tắc về các lớp trừu tượng:

  • Bạn không thể tạo một thể hiện của một lớp trừu tượng
  • Bạn không thể khai báo một phương thức trừu tượng bên ngoài một lớp trừu tượng
  • Khi một lớp được khai báo sealed, nó không thể được kế thừa, lớp trừu tượng không thể được khai báo sealed.

Chương trình sau đây giới thiệu một lớp trừu tượng:

using System;
namespace PolymorphismApplication
{
   abstract class Hinh
   {
      public abstract int DienTich();
   }
   class HCN:  Hinh
   {
      private int dai;
      private int rong;
      public HCN( int a=0, int b=0)
      {
         dai = a;
         rong = b;
      }
      public override int DienTich ()
      { 
         Console.WriteLine("Lop tim dien tich HCN :");
         return (width * length); 
      }
   }

   class HCNTester
   {
      static void Main(string[] args)
      {
         HCN hcn = new HCN(10, 7);
         double a = hcn.DienTich();
         Console.WriteLine("Dien tich: {0}",a);
         Console.ReadKey();
      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:

Lop tim dien tich HCN :
Dien tich: 70

Khi bạn có một hàm được định nghĩa trong một lớp mà bạn muốn được thực hiện trong một lớp kế thừa , bạn sử dụng hàm ảo. Hàm ảo có thể được thực hiện khác nhau trong các lớp kế thừa khác nhau và việc gọi đến các hàm này sẽ được quyết định tại thời gian chạy.

Đa hình động được thực hiện bởi abstract classesvirtual functions.

Chương trình sau đây chứng tỏ điều này:

using System;
namespace PolymorphismApplication
{
   class Hinh 
   {
      protected int rong, dai;
      public DienTich( int a=0, int b=0)
      {
         rong = a;
         dai = b;
      }
      public virtual int DienTich()
      {
         Console.WriteLine("Lop tim dien tich cha :");
         return 0;
      }
   }
   class HCN: Hinh
   {
      public HCN( int a=0, int b=0): base(a, b)
      {

      }
      public override int DienTich ()
      {
         Console.WriteLine("Lop tim dien tich HCN :");
         return (width * height); 
      }
   }
   class TamGiac: Hinh
   {
      public TamGiac(int a = 0, int b = 0): base(a, b)
      {
      
      }
      public override int DienTich()
      {
         Console.WriteLine("Lop tim dien tich tam giac :");
         return (width * height / 2); 
      }
   }
   class Goi
   {
      public void GoiDienTich(Hinh h)
      {
         int a;
         a = h.DienTich();
         Console.WriteLine("Dien tich: {0}", a);
      }
   }  
   class Tester
   {
      
      static void Main(string[] args)
      {
         Goi g = new Goi();
         HCN hcn = new HCN(10, 7);
         TamGiac t = new TamGiac(10, 5);
         g.GoiDienTich(hcn);
         g.GoiDienTich(t);
         Console.ReadKey();
      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:

Lop tim dien tich HCN:
Dien tich: 70
Lop tim dien tich tam giac:
Dien tich: 25

Chúc bạn thành công !

This site uses Akismet to reduce spam. Learn how your comment data is processed.