"Xin chào, Amigo! Cuối cùng thì chúng ta cũng đã tìm được một điều thực sự thú vị. Hôm nay tôi sẽ nói với các bạn về đa thừa kế . Đa thừa kế thực sự là một công cụ rất hấp dẫn và mạnh mẽ. Và nếu không có một số vấn đề, thì Java sẽ hỗ trợ nhiều lớp kế thừa. Nhưng nó không hỗ trợ, vì vậy chúng ta phải hài lòng với nhiều kế thừa giao diện . Điều này cũng khá tuyệt vời."

Kế thừa nhiều giao diện - 1

Hãy tưởng tượng bạn đang viết một trò chơi trên máy tính. Và các nhân vật của nó (đối tượng của bạn) phải cư xử theo những cách rất phức tạp: đi bộ trên bản đồ, thu thập vật phẩm, thực hiện nhiệm vụ, giao tiếp với các nhân vật khác, giết ai đó, cứu người khác. Giả sử bạn có thể chia tất cả các đối tượng thành 20 danh mục. Điều này có nghĩa là, nếu bạn may mắn, bạn sẽ có thể hoàn thành chỉ với 20 lớp để xác định các đối tượng của mình. Nhưng đây là điểm mấu chốt: các đối tượng này sẽ có bao nhiêu hình thức tương tác độc đáo? Mỗi loại đối tượng có thể có các tương tác riêng với 20 loại đối tượng khác (chúng tôi cũng đang tính các tương tác với các đối tượng cùng loại). Nói cách khác, bạn sẽ cần viết mã cho 20 x 20 = 400 tương tác! Và nếu số loại đối tượng duy nhất không phải là 20 mà là 100, thì số lượng tương tác có thể là 10.000!

"Chà! Giờ thì tôi đã hiểu tại sao lập trình lại là một công việc khó khăn đến vậy."

"Thật đơn giản. Nhờ có nhiều trừu tượng. Và không nhỏ nhờ có nhiều giao diện kế thừa."

Chúng ta thường có thể đơn giản hóa việc tương tác với đối tượng nếu các vai trò và/hoặc khả năng tương tác với nhau hơn là bản thân các đối tượng. Và như chúng ta đã biết, các khả năng có thể dễ dàng được thêm vào một lớp khi nó triển khai một số giao diện.

Khi viết một chương trình lớn, các nhà phát triển thường làm điều này ngay từ đầu:

1) Xác định tất cả các khả năng/vai trò.

2) Xác định sự tương tác giữa các vai trò này.

3) Sau đó, chỉ cần gán vai trò cho tất cả các lớp.

"Có thể là một ví dụ?"

"Tất nhiên. Hãy xem các vai diễn trong phim hoạt hình «Tom và Jerry»."

mã Java Sự miêu tả
interface Moveable
{}
— Vai trò/khả năng di chuyển.
interface Eatable
{}
— Vai trò/khả năng bị ăn thịt.
interface Eat
{}
— Vai trò/khả năng ăn thịt ai đó.
class Tom extends Cat implements Moveable, Eatable, Eat
{}
Tom là một con mèo có ba vai trò:
1) Nó có thể di chuyển
2) Nó có thể ăn thịt ai đó
3) Nó có thể bị ai đó (chó) ăn thịt
class Jerry extends Mouse implements Moveable, Eatable
{}
Jerry là một con chuột có hai vai trò:
1) Nó có thể di chuyển
2) Nó có thể bị ai đó ăn thịt
class Killer extends Dog implements Moveable, Eat
{}
Kẻ giết người là một con chó có hai vai trò: 1) Anh ta có thể di chuyển 2) Anh ta có thể ăn thịt ai đó

Chỉ biết ba vai trò (giao diện) này, bạn có thể viết một chương trình và mô tả đúng sự tương tác giữa các vai trò này. Ví dụ: một đối tượng sẽ đuổi theo (thông qua giao diện Di chuyển được) theo «kẻ bạn có thể ăn» và chạy trốn khỏi «kẻ có thể ăn thịt bạn». Và tất cả điều này mà không cần biết về các đối tượng cụ thể. Nếu bạn thêm nhiều đối tượng (lớp) vào chương trình và giữ các vai trò này, thì chương trình vẫn sẽ hoạt động tốt, kiểm soát hành vi của các đối tượng của bạn.