2012-06-24 26 views
11

Trong Hiệu quả Java, Joshua Bloch ưu tiên giao diện trên các lớp trừu tượng. Tuy nhiên, ông lưu ý rằng việc triển khai bộ xương nên đi kèm với mọi giao diện.Cách triển khai bộ xương khác với một lớp trừu tượng thông thường như thế nào?

Tôi cảm thấy rằng việc triển khai bộ xương gần như giống với lớp trừu tượng. Hai khái niệm này khác nhau như thế nào?

+0

Đối với giao diện _every_? Bạn có thể đưa ra một tham chiếu trang của tuyên bố này không? – Puce

Trả lời

6

Sửa sau khi đọc lại phần nói trên trong Effective Java

According to this section of the book một thực hiện xương một bản tóm tắt lớp học. Ông đề xuất phương pháp này bởi vì, sau khi thực hiện xương được đặt ra, nó trở nên tầm thường để thực hiện giao diện và các phương pháp ghi đè chọn lọc, ngay cả với một lớp ẩn danh (như trong cuốn sách của ông).


câu trả lời trước, thay đổi nội dung một chút cho tính liên tục

Một thực hiện xương về mặt lý thuyết có thể là một việc thực hiện đầy đủ và do đó bê tông. Sau đó, nó có thể được sử dụng với composition, bởi vì nó có thể được khởi tạo. Trong khi các lớp trừu tượng yêu cầu thừa kế.

0

Một "triển khai bộ xương" là một lớp cụ thể: bạn có thể biên dịch và kiểm tra nó.

Một lớp trừu tượng không phải là, và bạn không thể;)

+1

-1 Bạn có thể biên dịch mọi lớp được tạo đúng cách. Triển khai bộ xương là một lớp trừu tượng. –

+0

Dude, "triển khai xương" KHÔNG nhất thiết là lớp trừu tượng. – paulsm4

+0

Tôi đã downvoted câu trả lời của bạn chủ yếu là do "bạn có thể biên dịch". Nó là một lớp trừu tượng trong cuốn sách được giới thiệu. Đó là điều tôi muốn nói. –

2

Lớp giao diện/trừu tượng là một phần của API.

Việc triển khai bộ xương là một bê tông hợp lệ class, nhưng việc triển khai có giới hạn/chưa được thực hiện/kém; ví dụ (một ví dụ rất phù hợp), việc triển khai bộ xương của giao diện Sorter có thể thực hiện bubble sort - bạn sẽ không muốn sử dụng nó trong ứng dụng sản xuất, nhưng nó minh họa cách người ta có thể triển khai giao diện

4

Ý của anh ấy là bạn nên cung cấp một giao diện, và một lớp trừu tượng thực hiện phần của giao diện này:

public interface Foo { 
    void bar(); 
    void baz(); 
} 

private abstract class AbstractFoo implements Foo { 
    ... 
} 

lớp AbstractFoo có thể thậm chí không được trừu tượng nếu nó có thể cung cấp một cơ bản, thực hiện đầy đủ. Nhưng nếu bạn cần một lớp là một Foo, nhưng không thể mở rộng AbstractFoo, nó vẫn có thể với một giao diện. Một lớp trừu tượng không cung cấp khả năng này, vì bạn chỉ có thể mở rộng một lớp.

BTW, đây là những gì được thực hiện trong khuôn khổ bộ sưu tập (mà Josh Bloch tạo): giao diện Set được thực hiện bởi AbstractSet, giao diện List được thực hiện bởi AbstractList vv

2

tôi cảm thấy rằng một triển khai xương gần như giống với lớp trừu tượng . Hai khái niệm này khác nhau như thế nào?

Với tôi, chúng khác nhau trong mục đích .Khi tôi thấy một số phương pháp mong đợi một giao diện được truyền vào, tôi biết rằng việc thực hiện là tùy thuộc vào tôi. Nếu một lớp học được trả lại, tôi không còn chắc chắn nữa. Chỉ đơn giản là nghĩa là đối với việc sử dụng giao diện không tồn tại cho một lớp học.

Ngoài ra, các phương thức chấp nhận các lớp học cho các đối số mời xung đột khi lớp chúng tôi muốn chuyển vào đã là lớp con; Java không hỗ trợ đa kế thừa. Giao diện không có vấn đề này.

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