Từ đa hình nghĩ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 biểu thị 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. Trong đa hình tĩnh, phản hồi cho một hàm được xác định tại thời điểm biên dịch. Trong đa hình độngnó đượ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 sẽ 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 việc sử dụng hàm in() để 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ó. trừu tượng cá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.
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 niêm phongnó 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 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 ảo chứ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 các lớp trừu tượng và chức năng ảo.
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
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
