C # - Đa hình

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

Tính đa hình có thể là tĩnh hoặc động. Trongstatic polymorphism, phản hồi cho một hàm được xác định tại thời điểm biên dịch. Trongdynamic polymorphism, nó được quyết định tại thời điểm chạy.

Tính đ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à liên kết sớm. Nó còn được gọi là ràng buộc tĩnh. C # cung cấp hai kỹ thuật để triển khai tính đa hình tĩnh. Họ là -

  • Quá tải chức năng
  • Người vận hành quá tải

Chúng ta thảo luận về nạp chồng toán tử trong chương tiếp theo.

Quá tải chức năng

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

Ví dụ sau cho thấy sử dụng hàm print() để in các kiểu dữ liệu khác nhau -

using System;

namespace PolymorphismApplication {
   class Printdata {
      void print(int i) {
         Console.WriteLine("Printing int: {0}", i );
      }
      void print(double f) {
         Console.WriteLine("Printing float: {0}" , f);
      }
      void print(string s) {
         Console.WriteLine("Printing string: {0}", s);
      }
      static void Main(string[] args) {
         Printdata p = new Printdata();
         
         // Call print to print integer
         p.print(5);
         
         // Call print to print float
         p.print(500.263);
         
         // Call print to print string
         p.print("Hello C++");
         Console.ReadKey();
      }
   }
}

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

Printing int: 5
Printing float: 500.263
Printing string: 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 để cung cấp triển khai một phần lớp của một giao diện. Việc triển khai được hoàn thành khi một lớp dẫn xuất kế thừa từ nó.Abstractcác lớp chứa các phương thức trừu tượng, được thực hiện bởi lớp dẫn xuất. Các lớp dẫn xuất có nhiều chức năng chuyên biệt hơn.

Đâ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, các lớp trừu tượng không thể được khai báo là niêm phong.

Chương trình sau đây thể hiện một lớp trừu tượng:

using System;

namespace PolymorphismApplication {
   abstract class Shape {
      public abstract int area();
   }
   
   class Rectangle:  Shape {
      private int length;
      private int width;
      
      public Rectangle( int a = 0, int b = 0) {
         length = a;
         width = b;
      }
      public override int area () { 
         Console.WriteLine("Rectangle class area :");
         return (width * length); 
      }
   }
   class RectangleTester {
      static void Main(string[] args) {
         Rectangle r = new Rectangle(10, 7);
         double a = r.area();
         Console.WriteLine("Area: {0}",a);
         Console.ReadKey();
      }
   }
}

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

Rectangle class area :
Area: 70

Khi bạn có một hàm được xác định trong một lớp mà bạn muốn được triển khai trong (các) lớp kế thừa, bạn sử dụng virtualchức năng. Các hàm ảo có thể được triển khai khác nhau trong các lớp kế thừa khác nhau và lệnh gọi các hàm này sẽ được quyết định trong thời gian chạy.

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

Chương trình sau đây chứng minh điều này -

using System;

namespace PolymorphismApplication {
   class Shape {
      protected int width, height;
      
      public Shape( int a = 0, int b = 0) {
         width = a;
         height = b;
      }
      public virtual int area() {
         Console.WriteLine("Parent class area :");
         return 0;
      }
   }
   class Rectangle: Shape {
      public Rectangle( int a = 0, int b = 0): base(a, b) {

      }
      public override int area () {
         Console.WriteLine("Rectangle class area :");
         return (width * height); 
      }
   }
   class Triangle: Shape {
      public Triangle(int a = 0, int b = 0): base(a, b) {
      }
      public override int area() {
         Console.WriteLine("Triangle class area :");
         return (width * height / 2); 
      }
   }
   class Caller {
      public void CallArea(Shape sh) {
         int a;
         a = sh.area();
         Console.WriteLine("Area: {0}", a);
      }
   }  
   class Tester {
      static void Main(string[] args) {
         Caller c = new Caller();
         Rectangle r = new Rectangle(10, 7);
         Triangle t = new Triangle(10, 5);
         
         c.CallArea(r);
         c.CallArea(t);
         Console.ReadKey();
      }
   }
}

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

Rectangle class area:
Area: 70
Triangle class area:
Area: 25