Tài liệu Kế Thừa-Đa Hình phần 1 - Pdf 10

KẾ THỪA – ĐA HÌNH

· Đặc biệt hóa và tổng quát hóa

· Sự kế thừa

· Thực thi kế thừa

· Gọi phương thức khởi dựng của lớp
cơ sở

· Gọi phương thức của lớp cơ sở

· Điều khiển truy xuất

· Đa hình

· Kiểu đa hình· Phương thức đa hình

· Từ khóa new và override

· Lớp trừu tượng
· Gốc của tất cả các lớp - lớp Object

· Boxing và Unboxing dữ liệu

con người và xã hội động vật cùng sống trong một thế giới có quan hệ loài với nhau.
Quan hệ là một (is-a) là một sự đặc biệt hóa. Khi chúng ta nói rằng mèo là một loại
động
vật có vú, có nghĩa là chúng ta đ
ã nói rằng mèo là một trường hợp đặc biệt của loại
động vật
có vú. Nó có tất cả các đặc tính của bất cứ động vật có vú nào (như sinh ra con, có sữa
mẹ và
có lông ). Tuy nhiên, mèo có thêm các đặc tính riêng được xác định trong họ nhà
mèo mà các họ động vật có vú khác không có được. Chó cũng là loại động vật có vú,
chó cũng có tất cả các thuộc tính của động vật có vú, và riêng nó còn có thêm các
thuộc tính riêng xác định họ loài chó mà khác với các thuộc tính đặc bi
ệt của loài khác
ví dụ như mèo chẳng hạn.
Quan hệ đặc biệt hóa và tổng quát hóa là hai mối quan hệ đối ngẫu và phân cấp
với nhau. Chúng có quan hệ đối ngẫu vì đặc biệt được xem như là mặt ngược lại của
tổng quát. Do đó, loài chó và mèo là trường hợp đặc biệt của động vật có vú.
Ngược lại động vật có vú là trường hợp tổng quát từ các loài chó và mèo.
Mối quan hệ là phân cấp bở
i vì chúng ta tạo ra một cây quan hệ, trong đó các
trường hợp đặc biệt là những nhánh của trường hợp tổng quát. Trong cây phân cấp
này nếu di chuyển lên trên cùng ta sẽ được trường hợp tổng quát hóa, và ngược lại
nếu di chuyển xuống ngược nhánh thì ta được trường hợp đặc biệt hóa. Ta có sơ đồ
phân cấp minh họa cho loài chó, mèo và động vật có vú như trên:

ĐỘN
G

một số phần của mô hình UML để trình bày các biểu đồ quan hệ
giữa các lớp.
Trong UML, những lớp được thể hiện như các khối hộp, tên của lớp
được đặt trên cùng của khối hộp, và các phương thức hay các biến
thành viên được đặt bên trong hộp.
Như trong hình 5.1, mô hình quan hệ tổng quát hóa và đặc biệt hóa
được trình bày qua UML, ghi chú rằng mũi tên đi từ các lớp đặc biệt
hóa đến lớp tổng quát hóa. Windo
w

Button List Box
Hình 5.2: Quan hệ giữa thành phần cửa sổ

Hình 5.3 Dẫn xuất từ
Window
Giả sử chúng ta bắt đầu tạo một loạt các lớp đối tượng theo hình vẽ 5.3 như bên trên.
Sau
khi làm việc với RadioButton, CheckBox, và CommandButton một thời gian ta nhận
thấy chúng chia xẻ nhiều thuộc tính và hành vi đặc biệt hơn Window nhưng lại khá tổng
quát cho cả ba lớp này. Như vậy ta có thể chia các thuộ
c tính và hành vi thành một
nhóm lớp cơ sở riêng lấy tên là Button. Sau đó ta sắp xếp lại cấu trúc kế thừa như hình
vẽ 5.4. Đây là ví dụ về cách tổng quát hóa được sử dụng để phát triển hướng đối tượng.

Windo
w Butto
n
List
Box
Sự kế thừa

Trong ngôn ngữ C#, quan hệ đặc biệt hóa được thực thi bằng cách sử dụng sự
kế thừa. Đây không phải là cách duy nhấ
t để thực thi đặc biệt hóa, nhưng nó là cách
chung nhất và tự nhiên nhất để thực thi quan hệ này.
Trong mô hình trước, ta có thể nói ListBox kế thừa hay được dẫn xuất từ
Window. Window được xem như là lớp cơ sở, và ListBox được xem như là lớp
dẫn xuất. Như vậy, ListBox dẫn xuất tất cả các thuộc tính và hành vi từ lớp Window
và thêm những phần đặc biệt riêng để xác nhận ListBox.

Thực thi kế thừ
a

Trong ngôn ngữ C# để tạo một lớp dẫn xuất từ một lớp ta thêm dấu hai chấm vào
sau tên lớp dẫn xuất và trước tên lớp cơ sở:
public class ListBox : Window
Đoạn lệnh trên khai báo một lớp mới tên là ListBox, lớp này được dẫn xuất từ
Window. Chúng ta có thể đọc dấu hai chấm có thể được đọc như là “dẫn xuất từ”.
Lớp dẫn xuất sẽ kế thừ
a tất cả các thành viên của lớp cơ sở, bao gồm tất cả các phương
thức
và biến thành viên của lớp cơ sở. Lớp dẫn xuất được tự do thực thi các phiên bản
của một phương thức của lớp cơ sở. Lớp dẫn xuất cũng có thể tạo một phương thức
mới bằng việc đánh dấu với từ khóa new. Ví d
ụ 5.1 sau minh họa việc tạo và sử
dụng các lớp cơ sở và dẫn xuất.
Ví dụ 5.1: Sử dụng lớp dẫn xuất.

// Có hai biến thành viên private do đó

// hai biến này sẽ không thấy bên trong lớp

// dẫn xuất.
private int top;
private int left;
}// ListBox dẫn xuất từ
Window public class ListBox:
Window
{// Khởi dựng có tham số

public ListBox(int top, int left,

string theContents) : base(top, left) // gọi khởi dựng của lớp cơ sở{

mListBoxContents = theContents;

}


public static void Main()

{

// tạo đối tượng cho lớp cơ sở
Window w = new Window(5,
10); w.DrawWindow();
// tạo đối tượng cho lớp dẫn xuất

L
i
s
t
B
o
x lb = new ListBox( 20, 10, “Hello world!”);

lb.DrawWindow();

}

}

Kết quả:

Drawing Window at: 5, 10


Một điều lưu ý trong ví dụ 5.1 là việc lớp ListBox thực thi một phiên bản mới của
phương thức DrawWindow():
public new void DrawWindow()
Từ khóa new được sử dụng ở đây để chỉ ra rằng người lập trình đang tạo ra mộ
t phiên
bản mới cho phương thức này bên trong lớp dẫn xuất.
Nếu lớp cơ sở có phương thức khởi dựng mặc định, thì lớp dẫn xuất không cần bắt buộc
phải
gọi phương thức khởi dựng của lớp cơ sở một cách tường minh. Thay vào đó
phương thức khởi dựng mặc định của lớp cơ sở sẽ được gọi một cách ngầm định. Tuy
nhiên, nếu lớp cơ sở không có phương thức khởi dựng mặc định, thì tất cả các
lớp dẫn xuất của nó phải gọi phương thức khởi dựng của lớp cơ sở một cách tường
minh thông qua việc sử dụng từ khóa base.

Ghi chú: Cũng như thảo luận trong chương 4, nếu chúng ta không khai báo bất cứ
phương thức khởi dựng nào, thì trình biên dịch sẽ tạo riêng một phương thức khởi dựng
cho chúng
ta. Khi mà chúng ta viết riêng các phương thức khởi dựng hay là sử dụng phương
thức khởi dựng mặc định do trình biên dịch cung cấp hay không thì phương thức
khởi dựng mặc định không lấy một tham số nào hết. Tuy nhiên, lưu ý rằ
ng khi ta
tạo bất cứ phương thức khởi dựng nào thì trình biên dịch sẽ không cung cấp phương
thức khởi dựng cho chúng ta.

Gọi phương thức của lớp cơ sở

Trong ví dụ 5.1, phương thức DrawWindow() của lớp ListBox sẽ làm ẩn và
thay thế phương thức DrawWindow của lớp cơ sở Window. Khi chúng ta
gọi phương thức DrawWindow của một đối tượng của lớp ListBox thì phương thức
ListBox.DrawWindow() sẽ được thực hiện, không phải phương thức


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