2010-10-08 37 views
10

Tôi sử dụng giao diện/lớp cơ sở trừu tượng cho hầu hết các loại của mình và thường không kế thừa từ các lớp cụ thể nhưng gần đây tôi đã gặp phải tình huống thừa kế hoặc thành phần mong muốn. Tôi đã nhận thức được câu ngạn ngữ "chương trình cho một giao diện, không phải là một triển khai" nhưng gần đây đã quyết định đào sâu hơn.Thừa kế các lớp bê tông có phải là ác quỷ không?

Tôi đã thấy đối số againstinheritance và tôi đã thấy số lượt truy cập arguments nhưng tôi rất tò mò về những gì các nhà bảo trì cơ sở mã lớn thực sự làm trong cuộc sống thực. Nỗi sợ hãi có bị thổi phồng không? Bạn có kế thừa từ các lớp cụ thể hay là những người hoài nghi kế thừa đúng không? Tôi đặc biệt quan tâm đến việc nghe từ những người làm việc trong C++.

+1

Các chi tiết cụ thể khác sẽ hữu ích. Đây là đường biên giới không phải là một câu hỏi thực sự. – Potatoswatter

+0

Không, nó không phải là điều ác. Nó chỉ là nó thường không phải là điều đúng để làm. Nếu không có thêm chi tiết thì thật khó để đánh giá trường hợp của bạn. – jcoder

+0

Thừa kế là một công cụ, nó vốn không tốt hay xấu - nó phụ thuộc vào cách nó được sử dụng. –

Trả lời

11

Không phải là một anh chàng C++ (có kinh nghiệm chuyên nghiệp với hệ thống doanh nghiệp lớn trong C#, java, và ruby), nhưng đây là 2 cent tôi anyways

Đây không phải là một điều đen và trắng.

Vấn đề với kế thừa là nó giới thiệu khớp nối chặt chẽ. Tệ hơn nữa, khớp nối đó thường xung quanh trạng thái đóng gói. Những thay đổi trong các lớp siêu có thể có hiệu ứng gợn sóng xuống các hệ thống phân cấp thừa kế, tạo ra các lỗi phức tạp và khó dự đoán.

Phân tách giao diện hoàn toàn tránh các vấn đề đó, bởi vì nó không phá vỡ đóng gói theo cùng một cách.

Điều tốt về thừa kế là đôi khi bạn có một mô hình đối tượng thực sự là giống nhau, chỉ với một thay đổi hoặc bổ sung rất nhỏ. Miễn là thay đổi đó là rất rõ ràng, không rộng phạm vi, và không phải là một hạn chế bổ sung (xem các vấn đề circle-ellipse), việc tái sử dụng mã sẽ trump các khớp nối chặt chẽ.

Tôi dính vào thành phần trên thừa kế như quy tắc chung, chứ không phải luật.

+0

Ồ này. Chỉ cần một head-up, avatar của bạn giống hệt với Mike Stone. Tôi thực sự hỏi anh ấy về điều đó, và anh ấy nói với tôi rằng anh ấy đã thực sự tạo hình đại diện cho mình, bằng cách đẩy từng khung hình qua tập phim cụ thể và thực sự chỉnh sửa bằng tay nền. Tôi không nghĩ anh ấy đánh giá cao mọi người cũng xé toạc avatar của anh ấy. :-( –

+0

@Chris: Oh crap.Tôi thực sự tách nó ra khỏi một bạn bè MSN avatar (người không phải là đá mike, và trớ trêu thay không có vấn đề với tôi bằng cách sử dụng nó), figured ông chỉ có nó từ một tìm kiếm google. Tôi sẽ thay đổi nó càng sớm càng tốt. –

+1

@Chris: có một con cá bột đang bay trên một số trang web ngẫu nhiên, nên thay đổi bất cứ khi nào SO hết hạn lưu trữ. Các tỷ lệ cược mà một cái gì đó bạn nhận được qua msn hóa ra là sản phẩm yêu thương crafted của một người sử dụng hoạt động thực sự của một diễn đàn bạn xảy ra để được hoạt động trên? –

4

Bạn có thể nhận được tư nhân từ các lớp cụ thể. Thừa kế riêng không yêu cầu thay thế Liskov; về cơ bản nó chỉ là một cách thuận tiện để "kết hợp" chức năng của một lớp.

Thừa kế công khai, mặt khác, không yêu cầu khả năng thay thế Liskov. Vì vậy, thông thường, thừa hưởng công khai từ các lớp cụ thể là một điều xấu, trừ khi một lớp như vậy được thiết kế để được sử dụng như một lớp cơ sở (nhiều người không).

+0

Nhiều thiết bị không được thiết kế để có thể được thiết kế lại/tinh chỉnh một chút để hỗ trợ nó. – Potatoswatter

2

Thiết kế tốt quy định rằng các lớp cụ thể nên làm một điều tương đối nhỏ và hiệu quả. Đặc biệt trong C++, các lớp cụ thể nhấn mạnh sự giống nhau của chúng với các loại bê tông như intchar, thường do quá tải của toán tử và chỉ có các hàm không phải ảo. Vì các lớp bê tông không có ý định hiển thị hành vi đa hình, nên chúng không được kế thừa. Xem thêm phần 25.2 của The C++ Programming Language để biết thêm thông tin về cách sử dụng đúng loại bê tông trong ngôn ngữ đó.

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