2012-04-12 35 views
6

Tôi sử dụng GWT và cơ chế Hoạt động & Hoạt động.Tại sao sử dụng lớp trừu tượng trống thay vì giao diện?

Thật buồn khi Địa điểm là một lớp vì địa điểm tùy chỉnh của tôi không thể mở rộng lớp khác.

Khi tôi nhìn vào mã Place, tôi thấy như sau:

public abstract class Place { 

    /** 
    * The null place. 
    */ 
    public static final Place NOWHERE = new Place() { 
    }; 

} 

Thấy rằng, Place có thể là một giao diện. Có lý do chính đáng nào mà nhóm GWT đã chọn đặt một lớp trừu tượng thay vì một giao diện không?

Và để khái quát: có lý do chính đáng để tạo giao diện lớp trừu tượng trống thực sự không?

+0

Giao diện cũng có thể có hằng số, do đó hằng số 'NOWHERE' không ảnh hưởng đến quyết định cho dù đó là giao diện hay lớp trừu tượng. –

+0

Tại sao lại là downvote? –

+0

@Christopher: bạn nói đúng. Tôi chỉnh sửa bài đăng của mình. Đối với khách downvote: xin vui lòng cho tôi gợi ý để cải thiện câu hỏi của tôi, tôi không hiểu tại sao bạn downvote tôi. –

Trả lời

2

tôi có thể không thực sự nói cho Place (mặc dù tôi có một vài ý tưởng, xem dưới đây), nhưng nó đã được thảo luận cho Activity: https://groups.google.com/d/topic/google-web-toolkit-contributors/V8rhZHiXFRk/discussion

Theo như chúng ta có thể đi vào lịch sử, Placealways been một lớp trừu tượng trong GWT (và FWIW, địa điểm NOWHERE đã được thêm long after; lưu ý rằng cam kết này tham chiếu Wave -soon để biến mất khỏi internet - nơi chúng ta có thể thấy interface Place do đó nó là một giao diện tại một số thời điểm trong khi họ thiết kế API).

Cho rằng PlaceHistoryGenerator (được sử dụng khi bạn GWT.create() a PlaceHistoryMapper) xem xét phân cấp địa điểm, có lớp trừu tượng cắt giảm toàn bộ nhiều trường hợp cạnh!
Hãy tưởng tượng tài liệu PlaceHistoryMapper của bạn tham chiếu PlaceTokenizers<Foo>PlaceTokenizer<Bar> và bạn có class FooBar implements Foo, Bar { }, trình thông báo nào nên được sử dụng? Nếu bạn không tham chiếu đến lớp FooBar một cách rõ ràng trong số PlaceHistoryMapper của mình, trình tạo sẽ không nhìn thấy nó (hoặc đúng hơn là không nhìn vào nó), vậy nó sẽ tạo ra loại mã nào? Và hãy nhớ rằng tất cả chúng ta đều muốn quyết định, vì vậy mã được tạo nên luôn giống nhau. Sử dụng một lớp, trình tạo có thể sắp xếp chúng bằng cây thừa kế của chúng (từ nguồn gốc cụ thể nhất đến ít nhất), và có thể giả định rằng 2 địa điểm có các lớp không có mối quan hệ thừa kế riêng biệt được kiểm tra (instanceof trong mã được tạo) theo bất kỳ thứ tự nào và vẫn mang lại kết quả ổn định.

Tuyên bố từ chối trách nhiệm: Tôi là người reported vấn đề đặt hàng và sau đó provided the patch, nhưng Place đã là một lớp học.

+0

cảm ơn câu trả lời của bạn, đây là câu trả lời rõ ràng và lý trí nhất. Tôi hợp lệ nó. –

7

Nói chung tôi sẽ không định nghĩa một lớp trừu tượng trống

Tuy nhiên, khi tôi mong chờ một số thành viên trong thời gian tới, tôi có thể quyết định sử dụng lớp trừu tượng thay vì giao diện

"lớp học" có nghĩa là: này lÀ mỘT

"giao diện" có nghĩa là: này HỖ TRỢ

đối với "Place" tôi thực sự có thể nhìn thấy cả hai với một chút sở thích trực quan cho lớp

+0

bạn có nghĩa là "mong đợi một số đối tượng" khi bạn nói "mong đợi một số thành viên"? –

+0

@Aditya Naidu Không, ý tôi là các phương pháp thành viên hoặc các lĩnh vực thành viên –

5

Có lý do chính đáng nào mà nhóm GWT đã chọn đặt một lớp trừu tượng thay vì một giao diện không?

Tôi không thể nghĩ ra. Nhưng để được thực tế, phàn nàn về nó trên SO sẽ không đạt được bất cứ điều gì.

Và để khái quát: có lý do chính đáng để tạo giao diện lớp trừu tượng trống thực sự không?

Giả thuyết, bạn có thể thực hiện việc này để đảm bảo rằng có một lớp cơ sở chung duy nhất cho các yêu cầu dự đoán trong tương lai ... hoặc vì một lý do nào đó khác.

Nhưng nói chung đó là một ý tưởng tồi ... IMO.

(Tất nhiên, mọi thứ như thế này thường xảy ra vì những lý do lịch sử;. Ví dụ như lớp abstract có thể đã có nhiều thành viên trong quá khứ mà đã từ đó đã được gỡ bỏ)

+2

Cảm ơn bạn đã trả lời, tôi đã không hiểu, vì tôi nghĩ rằng nhóm Gwt thường chọn thiết kế tốt và điều này làm tôi bối rối. –

+0

Không ai là hoàn hảo. Đừng lo lắng về điều đó. –

+1

+1 vì lý do lịch sử ... thật dễ dàng để chỉ trích một thiết kế khi bạn không hiểu lịch sử (và các giao dịch được thực hiện để đáp ứng các yêu cầu khác nhau). – David

0

tôi không thể nói cho đội GWT, nhưng lý do duy nhất có vẻ là cho lớp trừu tượng này là bắt buộc định nghĩa NGAY BÂY GIỜ.

Như bạn đã biết, sử dụng các lớp trừu tượng theo cách này sẽ buộc bạn vào một hệ thống phân cấp lớp có thể không phù hợp với mô hình kinh doanh của bạn. Vì vậy, nói chung, nếu lớp trừu tượng đã thực sự hoàn toàn trống rỗng, sẽ không có mục đích gì cả.

Ví dụ này đặc biệt lạ bởi vì giao diện là hợp đồng. GWT Place không có giao diện và do đó không có hợp đồng.bang javadoc của họ:

"Đại diện cho một vị trí đánh dấu trang trong một ứng dụng"

tôi dự kiến ​​sẽ có một số hợp đồng được xác định để đối phó với tình huống này. Địa điểm có thể đánh dấu là gì? Nếu đây chỉ là một điểm đánh dấu, như Serializable, tôi chắc chắn sẽ mong nó là một giao diện chứ không phải là một lớp trừu tượng.

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