Dùng đa kế thừa trong Java như thế nào?

Theo em biết thì C++ là ngôn ngữ hỗ trợ đa kế thừa. Tuy Java không có tính này nhưng vẫn hỗ trợ phần nào. Mọi người cho em hỏi kỹ hơn về đa kế thừa trong java được không ạ?
Ta có thể dùng nó khi nào? Dùng như thế nào?
Nó có ưu nhược điểm gì? Tại sao chỉ dùng đơn kế thừa mà lại hạn chế đa kế thừa?
Cho em xin cái ví dụ cụ thể ạ?
Có phải extends thì kế thừa đơn còn implement có thể đa kế thừa không ạ?
Em xin cảm ơn

1 Like

Java không hỗ trợ đa kế thừa nhé. Đa kế thừa sẽ dẫn đến “diamond problem”.
Ví dụ: nếu có đa kế thừa, 1 class A kế thừa từ B và C, giả sử B và C đều có chung 1 hàm giống hệt nhau. Vậy từ A gọi hàm đó sẽ gọi hàm của B hay C?. để giải quyết vấn đề này có nhiều cách, 1 trong số đó là bỏ đa kế thừa đi như Java ^^.
Java hỗ trợ 1 phần nào đa kế thừa bằng các Interface. Interface thê hiện Đối tượng đó có thể làm những gì? còn extends 1 class là Đối tượng đó là gì.

Điều này cũng đúng như trong thưc tiễn, Bạn chỉ có thể là con người chứ không thể vừa là con Người, vừa là con Mèo được. Còn bạn có thể có nhiều khả năng như trèo cây giống con Mèo, bơi giống con Cá…

10 Likes

anh có thể giúp em hiểu kỹ hơn về Interface không ạ?
Tức là nó giống 1 class tuy nhiên không có thuộc tính mà chỉ có các phương thức ạ? hay là thế nào vậy?

Để hiểu hơn về interface, bạn hãy tập hiểu: Hàm gồm 2 phần là tên hàm (declaration) và thân hàm (definition). Implement ám chỉ việc bạn phải viết definition cho nó. 1 interface sẽ chỉ chứa declaration, chứ ko có definition. 1 class implements 1 interface thì class đó phải viết definition cho hàm trong interface đó.
P/s: làm độ 3 bài tập về interface là ngộ ra ngay ý mà.

3 Likes

Bạn đã biết đến implement thì bạn đã biết gì về interface rồi? Bạn thử nói ra xem sai gì mọi người góp ý.

Phải chăng các Interface chỉ là 1 khuôn mẫu. trong đó các hàm chỉ có tên hàm mà hoàn toàn không có thân hàm. Tức hàm đó không có câu lệnh gì. Chỉ khi ta imlement nó thì nó được ghi đè và ta có thể làm bất cứ điều gì phải không ạ?
Nếu đúng là nv thì e thấy thật phiền phức. Tại sao t không tạo các method luôn mà lại phải tạo cái tên mà không định nghĩa cho nó. Nhỡ đâu ta k dùng mà vẫn phải Override. Thật là em rất thắc mắc!!!

Đúng rồi!

Không dùng thì sẽ không implements interface đó, chứ không phải Override.
C++ cho phép đa kế thừa, nhưng lại gây ra “Diamon problem”. James Gosling đã vứt đa kế thừa đi để giải quyết, nhưng bổ sung thêm Interface để giữ lại cái hay của tính đa hình và viết ra Java.
Ví dụ thì bạn xem bài số #9, #17#18 trong link [sau][1]

Interface (hay gián tiếp nói đến sự đa hình) có ứng dụng lớn trong việc thiết kế các thư viện lập trình. Vì người viết thư viện chỉ quan tâm cung cấp 1 chức năng như thế nào, mà không cần quan tâm người dùng thư viện dùng chức năng đó làm gì. (Ví dụ: thư viện game cung cấp chức năng nhận nút bấm A, nhưng không quan tâm 1 game abc gì đó nhận nút bấm A đó để chém hay nhảy gì cả).
[1]: http://congdongjava.com/forum/threads/thắc-mắc-interface-trong-java.3222/

3 Likes

Cảm ơn bác, có lẽ em hiểu hơn về Interface rồi ạ

Kể cả C# cũng như Java không còn kiểu đa kế thừa như C++ nữa. Bạn muốn lập trình hướng đối tượng sâu thì nên tìm hiểu về interface nhé

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?