2010-01-20 32 views
17

Tôi có một lớp học CardStack. Tôi có một số lớp học kế thừa từ CardStack ví dụ: Cascade, Deck, Foundation, vvTạo ra một lớp học trống hoàn toàn để phân biệt nó với một lớp học tốt khác?

Foundation không cần phải thêm bất kỳ chức năng để CardStack, nhưng đối với mục đích hiển thị ứng dụng của tôi cần phải biết được những CardStack s thực sự Foundation s.

Ngẫu nhiên, tôi không có chức năng như vậy CardStack.Display() (Tôi đang sử dụng mẫu kiểu xem-bộ điều khiển trong đó đối tượng View chỉ cần truy vấn Model để tìm hiểu loại đối tượng nào đang xử lý).

Có vẻ như OK với tôi, nhưng có bất kỳ lý do nào không để thực hiện việc này không?

class Foundation : public CardStack 
{ 

}; 

class Model 
{ 
    Cascade cascade[10]; 
    Foundation foundations[10]; 
    ... 
}; 
+1

Been suy nghĩ bản thân mình này rất nhiều lần, chỉ cần không bao giờ figured tôi thực sự muốn để biết người khác cảm thấy thế nào về nó :) – cwap

Trả lời

12

Không có gì sai với điều này.

Làm mọi lúc.

Trong tương lai, có thể có sự khác biệt về cấu trúc, hành vi hoặc triển khai. Bây giờ, chúng xảy ra để chia sẻ rất nhiều tính năng phổ biến.

+0

Tôi thường làm điều tương tự với typedef, biết rằng nó có thể được thay đổi thành định nghĩa lớp với kế thừa sau này. Phần xấu duy nhất đang cố gắng chuyển tiếp một tuyên bố typedef. –

5

Tôi không thấy bất kỳ vấn đề kỹ thuật nào với nó, vì vậy có thể bạn đang làm điều này vì lý do ngữ nghĩa. Trong trường hợp đó, hãy chắc chắn rằng bạn ghi lại lý do nó RẤT R CLE RÀNG để các lập trình viên bảo trì sau này không thử và thay đổi mọi thứ.

+0

Nó có vẻ như 'lớp Foundation: public CardStack {};' sẽ là tài liệu khá rõ ràng. "Tại sao" nên rõ ràng. "Họ cũng làm như vậy." Tôi không chắc chắn rằng nó có thể tài liệu rõ ràng hơn. Bạn có vấn đề hoặc mối quan tâm cụ thể nào cần phải được ghi chép ở trên và vượt quá rõ ràng không? –

+1

@SLott: Trong các hệ thống có 'lớp B: lớp A {}; 'Đôi khi tôi thấy các tình huống mà cùng một mẫu mã đôi khi được viết với các đối tượng kiểu A và đôi khi thuộc loại B. Tôi hỏi người đã viết một số những đoạn mã này tại sao anh ta chuyển đổi qua lại: câu trả lời là "chúng giống nhau vậy tại sao nó lại quan trọng?". A và B có thể có ý nghĩa với nhà phát triển ban đầu, nhưng sau 3 thế hệ lập trình viên bảo trì, nó đã trở thành một cơn ác mộng khủng khiếp. Không có tài liệu rõ ràng nào về "tại sao". Tôi loại bỏ B, và refactored tất cả mọi thứ để tham khảo A. Và tất cả vẫn làm việc tốt :) – FrustratedWithFormsDesigner

+0

... Nhưng để công bằng, cũng đã có một trường hợp FEW, nơi tôi cảm thấy nó thực sự cần thiết. Tôi cố tránh mô hình này nhiều nhất có thể, nhưng khi tôi phải sử dụng nó, tôi cố gắng viết tài liệu càng rõ ràng càng tốt. Chỉ vì nó rõ ràng với tôi không có nghĩa là nó sẽ rất rõ ràng cho các nhà phát triển tiếp theo, hoặc sau đó hoặc sau đó ... – FrustratedWithFormsDesigner

2

Đúng, điều này hợp lệ và hữu ích. Một lớp trống có thể hoạt động như trình giữ chỗ cho các chức năng trong tương lai (ví dụ). Tất nhiên, một chút tài liệu là theo thứ tự nếu lớp được đề cập là "được kết nối" với chương trình theo bất kỳ cách nào ;-)

Trong trường hợp của bạn ở trên, mã C++ được tạo sẽ không bị đè nặng ... nhưng khả năng đọc mã của bạn được tăng lên.

0

Không có gì sai với nó, tôi làm điều này thường xuyên. Tôi thích nó tốt hơn so với giao diện "đánh dấu" rỗng (trong Java). Như những người khác đã đề cập, bạn có lẽ nên bình luận về thực tế là việc thực hiện được cho là có sản phẩm nào (hoặc có thể là "dành cho sử dụng trong tương lai"), nhưng nếu không IMHO bạn đang sử dụng tốt.

2

tôi làm điều đó tất cả các thời gian cho các danh sách

public class MyObjects : List<MyObject> { } 
+1

@Chad, Sẽ không phải là một typedef có ý nghĩa hơn trong trường hợp này? – luke

+0

@ luke, tôi thường mã trong C#, và không có typedef trong đó. Nhưng nó sẽ không nhất thiết phải ở trong một lớp học trống ... – CaffGeek

1

Đó là thực hành tốt, vì nó là ngữ nghĩa rõ ràng hơn với gần, với gần như không có chi phí liên quan và cho phép thay đổi, khi có nhu cầu cho lớp con làm hành xử khác nhau .

+0

1 vì đã đề cập rõ ràng về ngữ nghĩa, mà không có câu trả lời nào khác cho đến nay đã nhấn mạnh đủ cho khẩu vị của tôi. –

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