Thừa kế và đa hình - Pdf 63

Thừa kế và Đa hình Gvhd: Nguyễn Tấn Trần Minh Khang

35 Chương 5 Thừa kế và Đa hình
Thừa kế là cách tạo mới một lớp từ những lớp có sẵn. Tức là nó cho phép tái sử
dụng lại mã nguồn đã viết trong lớp có sẵn. Thừa kế nói đơn giản là việc tạo một
đối tượng khác B thừa hưởng tất cả các đặc tính của lớp A. Cách này gọi là đơn
thừa kế. Nếu lớp B muốn có đặc tính của nhiều lớp A1, A2 … thì gọi là đa thừa kế.
Đa thừa kế là khái niệm rất khó cài đặt cho các trình biên dịch. C# cũng như nhiều
ngôn ngữ khác tìm cách tránh né khái niệm này.
Đa hình là việc lớp B thừa kế các đặc tính từ lớp A nhưng có thêm một số cài đặt
riêng.
5.1 Đặc biệt hoá và tổng quát hoá
Sự đặc biệt và tổng quát hoá có mối quan hệ tương hổ và phân cấp. Khi ta nói
ListBox và Button là những cửa sổ (Window), có nghĩa rằng ta tìm thấy được đầy đủ
các đặc tính và hành vi của Window đều tồn tại trong hai loại trên. Ta nói rằng
Window là tổng quát hoá của ListBox và Button; ngược lại ListBox và Button là hai
đặc biệt hoá của Window
5.2 Sự kế thừa
Trong C#, mối quan hệ chi tiết hoá là một kiểu kế thừa. Sự kế thừa không cho mang
ý nghĩa chi tiết hoá mà còn mang ý nghĩa chung của tự nhiên về mối quan hệ này.
Khi ta nói rằng ListBox kế thửa từ Window có nghĩa là nó chi tiết hoá Window.
Window được xem như là lớp cơ sở (base class) và ListBox được xem là lớp kế thừa
(derived class). Lớp ListBox này nhận tất cả các đặc tính và hành vi của Window và
chi tiết hoá nó bằng một số thuộc tính và phương thức của nó cần.
5.2.1 Thực hiện kế thừa
Trong C#, khi ta tạo một lớp kế thừa bằng cách công một thêm dấu “:” và sau tên
của lớp kế thừa và theo sau đó là lớp cơ sở như sau:
public class ListBox : Window

{
// thêm tham số vào constructor
public ListBox(
int top,
int left,
string theContents):
base(top, left) // gọi constructor cơ sở
{
mListBoxContents = theContents;
}
// tạo một phương thức mới bởi vì trong
// phương thức kế thừa có sự thay đổi hành vi
public new void DrawWindow( )
{
base.DrawWindow( ); // gọi phương thức cơ sở
System.Console.WriteLine ("Writing string to the listbox:
{0}", mListBoxContents);
}
private string mListBoxContents; // biến thành viên mới
}
public class Tester
{
public static void Main( )
{
// tạo một thể hiện cơ sở
Window w = new Window(5,10);
w.DrawWindow( );
// tạo một thề hiện kế thừa
ListBox lb = new ListBox(20,30,"Hello world");
lb.DrawWindow( );

tâm đến chi tiết.
5.3.1 Tạo kiểu đa hình
ListBox và Button đều là một Window, ta muốn có một form để giữ tập hợp tất cả
các thể hiện của Window để khi một thể hiện nào được mở thì nó có thể bắt
Window của nó vẽ lên. Ngắn gọn, form này muốn quản lý mọi cư xử của tất cà các
đối tượng đa hình của Window.
5.3.2 Tạo phương thức đa hình
Tạo phương thức đa hình, ta cần đặt từ khoá virtual trong phương thức của lớp cơ
sở. Ví dụ như:
public virtual void DrawWindow( )
Trong lớp kế thừa để nạp chồng lại mã nguồn của lớp cơ sở ta dùng từ khoá
override khi khai báo phương thức và nội dung bên trong viết bình thường. Ví dụ về
nạp chồng phương thức DrawWindow:
public override void DrawWindow( )
{
Thừa kế và Đa hình Gvhd: Nguyễn Tấn Trần Minh Khang

38
base.DrawWindow( ); // gọi phương thức của lớp co sở
Console.WriteLine ("Writing string to the listbox: {0}",
listBoxContents);
}
Dùng hình thức đa hình phương thức này thì tuỳ kiểu khai báo của đối tượng nào thì
nó dùng phương thức của lớp đó.
5.3.3 Tạo phiên bản với từ khoá new và override
Khi cần viết lại một phương thức trong lớp kế thừa mà đã có trong lớp cơ sở nhưng
ta không muốn nạp chồng lại phương thức virtual trong lớp cơ sở ta dùng từ khoá
new đánh dấu trước khi từ khoá virtual trong lớp kế thừa.
public class ListBox : Window
{

base(top, left) // call base constructor
{
listBoxContents = contents;
}
// an overridden version implementing the
// abstract method
Thừa kế và Đa hình Gvhd: Nguyễn Tấn Trần Minh Khang

39
public override void DrawWindow( )
{
Console.WriteLine("Writing string to the listbox: {0}",
listBoxContents);
}
private string listBoxContents; // new member variable
}
public class Button : Window
{
public Button( int top, int left): base(top, left)
{
}
// implement the abstract method
public override void DrawWindow( )
{
Console.WriteLine("Drawing a button at {0}, {1}\n", top, left);
}
}
public class Tester
{
static void Main( )


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status