Tải bản đầy đủ (.pdf) (6 trang)

Tính đa hình trong C | 85 bài học lập trình C hay nhất PDF

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (365.7 KB, 6 trang )

/>
Copyright © vietjack.com

Tính đa hình trong C#
Từ polymorphism (tính đa hình) nghĩa là có nhiều hình thái. Trong lập trình hướng đối tượng, tính
đa hình thường được diễn đạt như là “một Interface, nhiều hàm”.
Tính đa hình trong C# có thể là static hoặc dynamic. Trong đó, kiểu đa hình static có thể được
gọi là đa hình tĩnh và kiểu đa hình dynamic có thể được gọi là đa hình động.
Trong đa hình tĩnh, phần phản hồi tới một hàm được xác định tại compile time. Trong khi đó với đa
hình động, nó được quyết định tại runtime.

Đa hình static trong C#
Kỹ thuật 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à Early Binding. Nó
cũng được gọi là Static Binding. C# cung cấp hai kỹ thuật để triển khai đa hình tĩnh. Chúng là:


Nạp chồng hàm (Function overloading)



Nạp chồng toán tử (Operator overloading)

Chúng ta sẽ bàn luận về nạp chồng toán tử trong chương sau.

Nạp chồng hàm trong C#
Bạn có thể có nhiều định nghĩa cho cùng tên hàm trong cùng một phạm vi. Các định nghĩa này của
hàm phải khác nhau: như kiểu và/hoặc số tham số trong danh sách tham số. Trong C#, bạn không
thể nạp chồng các khai báo hàm mà chỉ khác nhau ở kiểu trả về.
Ví dụ sau minh họa cách sử dụng hàm print() để in các kiểu dữ liệu khác nhau trong C#:
using System;
namespace PolymorphismApplication


{
class Printdata
{
void print(int i)
{
Console.WriteLine("Printing int: {0}", i );
}

Trang chia sẻ các bài học online miễn phí

Page 1


/>
Copyright © vietjack.com

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 code trên được biên dịch và thực thi, nó sẽ cho kết quả:
Printing int: 5
Printing float: 500.263
Printing string: Hello C++

Trang chia sẻ các bài học online miễn phí

Page 2


/>
Copyright © vietjack.com

Đa hình dynamic trong C#
C# cho phép bạn tạo các lớp abstract (trừu tượng) mà được sử dụng để cung cấp trình triển khai
cục bộ lớp của một Interface. Trình triển khai (Implementation) được hoàn thành khi một lớp kế
thừa kế thừa từ nó. Các lớp Abstract chứa các phương thức abstract, mà được triển khai bởi lớp
kế thừa. Lớp kế thừa này có tính năng chuyên dụng hơn.

Dưới đây là một số qui tắc về các lớp abstract trong C#:


Bạn không thể tạo một Instance (sự thể hiện) của một lớp abstract.



Bạn không thể khai báo một phương thức abstract ở bên ngoài một lớp abstract.



Khi một lớp được khai báo là sealed, nó không thể được kế thừa, các lớp abstract không
thể được khai báo là sealed.

Ví dụ sau minh họa một lớp abstract trong C#:
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 :");

Trang chia sẻ các bài học online miễn phí

Page 3


/>
Copyright © vietjack.com

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 code trên được biên dịch và thực thi, nó sẽ cho kết quả:
Rectangle class area :
Area: 70

Khi bạn có một hàm được định nghĩa trong một lớp mà bạn muốn được triển khai một lớp được kế
thừa, bạn sử dụng hàm virtual trong C#. Các hàm virtual có thể được triển khai một cách khác
nhau trong lớp được kế thừa khác nhau và việc gọi những hàm này sẽ được quyết định tại runtime.
Đa hình động trong C# được triển khai bởi các lớp abstract và các hàm virtual.
Ví dụ sau minh họa điều này:
using System;
namespace PolymorphismApplication
{
class Shape
{
protected int width, height;
public Shape( int a=0, int b=0)

Trang chia sẻ các bài học online miễn phí

Page 4


/>
Copyright © vietjack.com

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


Trang chia sẻ các bài học online miễn phí

Page 5


/>
Copyright © vietjack.com

}
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 code trên được biên dịch và thực thi, nó sẽ cho kết quả:
Rectangle class area:
Area: 70
Triangle class area:
Area: 25

Trang chia sẻ các bài học online miễn phí

Page 6



×