2012-11-19 58 views
8

Tôi là khá nhiều người mới bắt đầu java và tôi đã đến để hỏi diễn đàn stackoverflow cho một câu hỏi đơn giản. Tôi đã kiểm tra câu hỏi tương tự ở đây trên SO, nhưng tôi đã không tìm thấy câu trả lời mong muốn, LINK: Is there any relation between the class that implements interface and that interface?Mối quan hệ giữa các lớp thực hiện cùng một giao diện

Chúng tôi biết nếu Cát kéo dài Animal, có một mối quan hệ ở đây. Vì vậy, mèo là một động vật (nhưng không nhất thiết phải khác. Động vật cũng là một con chó ..). Chúng tôi biết mối quan hệ này là "is-a" - thừa kế .

Nếu chúng ta có thêm hai lớp: Cô gáiKẹo và nếu lớp Cô gái nắm giữ thể hiện của kẹo, sau đó chúng tôi đặt tên cho mối quan hệ này "có-một" - phần, bởi vì chúng ta có thể nói rằng Girls has- một kẹo.

Sửa lỗi nếu tôi đã làm điều gì đó sai với các ví dụ trên.

Dù sao câu hỏi của tôi là liệu có một số mối quan hệ giữa các đối tượng của các lớp thực hiện cùng một giao diện không? Giả sử:

public class A implements InterfaceA {} 

public class B implements InterfaceA {} 

Nếu có mối quan hệ nào đó, chúng ta có thể tận dụng mối quan hệ đó như thế nào? Cảm ơn câu trả lời của bạn trước ..

EDIT: Đối với những người nghĩ rằng không có mối quan hệ, tôi có một cuốn sách "java cách lập trình ấn bản thứ chín" và có biểu đồ UML hiển thị các lớp thực hiện giao diện trong "mối quan hệ"?

Ảnh:

enter image description here

+0

A là một InterfaceA và chúng ta có thể kiểm tra nó bằng 'myObject instanceof InterfaceA', trong đó myObject là instance của A hoặc B – hoaz

+0

Tôi đề nghị bạn đọc về [Composition over inheritance] (http://en.wikipedia.org/wiki/Composition_over_inheritance) –

+0

Tôi ngạc nhiên bởi cách hầu hết người trả lời cơ bản đã hiểu nhầm câu hỏi này. Nó có vẻ khá rõ ràng với tôi. –

Trả lời

6

Không có mối quan hệ nào giữa các đối tượng thực hiện cùng một giao diện. Cả hai đều là những triển khai độc lập của riêng chúng. Họ chỉ cần làm theo giao thức được xác định bởi giao diện.

Nếu bạn cố gắng truyền từ một loại đối tượng sang loại đối tượng khác, bạn sẽ kết thúc nhận được ClassCastException.

EDIT:

sơ đồ UML của bạn gợi ý rằng có mối quan hệ giữa giao diện và lớp (IS-A), nhưng không phải giữa hai lớp mà thực hiện cùng một giao diện. Không có dòng nào có biểu tượng mối quan hệ giữa các lớp (như bạn thấy giữa lớp và giao diện)

+0

Câu trả lời đơn giản. Cảm ơn vì đã dọn sạch tâm trí của tôi. – rootpanthera

+0

@rootpanthera: Rất vui được. Thưởng thức mã hóa. – kosa

0

Mối quan hệ giữa một lớp học thực hiện và giao diện, và giao diện cũng là một "là-một" mối quan hệ, giống như kéo dài từ một lớp học. Nó hữu ích (hoặc ít nhất một lý do nó hữu ích) bởi vì bằng cách cung cấp một giao diện, bạn có thể viết mã cho một giao diện chứ không phải mã để thực hiện giao diện đó, làm cho nó dễ dàng (nếu bạn cần) trao đổi triển khai với tối thiểu là phiền phức. Lưu ý rằng nếu bạn đang "vượt qua" hệ thống phân cấp thừa kế, vì vậy hãy xem xét mối quan hệ giữa hai lớp thừa kế cùng một giao diện, không có mối quan hệ ngầm ở đây cả.

+0

Mối quan hệ giữa một lớp thực hiện một giao diện và giao diện đó được mô tả tốt nhất là một liên kết IS. Như trong: IS của nhân viên (thực hiện) Fireable. – gherson

1

Điều này có nghĩa là lớp học của bạn có hành vi tương tự được mô tả bằng phương pháp giao diện.Ví dụ, xem xét hai lớp: FishBird. Cả hai đều có thể thực hiện giao diện Moveable như:

inteface Moveable{ 
    void move(int x, int y, int z); 
} 

class Fish implements Moveable{ 
    public void move(int x, int y, int z){ 
     swim(x, y, z); 
    } 
    private void swim(int x, int y, int z){ 
     //a method describing how the fish swims 
    } 
} 

class Bird implements Moveable{ 
    public void move(int x, int y, int z){ 
     fly(x, y, z); 
    } 

    private void fly(int x, int y, int z){ 
     //a method describing how the bird flies 
    } 
} 

Bạn có thể gọi các hành vi quy định bằng các phương pháp giao diện như:

Moveable bird = new Bird(); 
Moveable fish = new Fish(); 

bird.move(10,10,10); 
fish.move(10,10,-10); 

Vì vậy, một trong hai trong số họ có thể di chuyển, mặc dù cách họ di chuyển khác nhau rất nhiều. Bằng cách này, cả hai lớp đều chia sẻ hành vi chung mặc dù việc triển khai của nó có thể không được bạn biết đến.

+0

Cảm ơn bạn đã cứu mạng. gián tiếp tôi nhận được điểm mà tôi sai. :) –

0

Không có tên chính thức cho mối quan hệ giữa hai lớp triển khai cùng một giao diện.

Hoặc, cho vấn đề đó, mở rộng cùng một lớp cơ sở. Nếu một đứa trẻ kéo dài đứa trẻ khác là con của nó, thì hai đứa con của cùng một lớp là anh chị em ruột, nhưng đây không phải là một thuật ngữ thường được sử dụng.

Nếu bạn muốn mở rộng ẩn dụ nhân học này cho các giao diện, bạn có thể gọi hai triển khai của giao diện trông giống nhau, có lẽ.

Các vấn đề liên quan