Thành phần và kế thừa.Có thành phần nào không thể thực hiện được thừa kế đó không?
Tôi biết rằng cả hai công cụ đều được chọn khi thích hợp và bối cảnh rất quan trọng trong việc lựa chọn giữa bố cục và kế thừa. Tuy nhiên, các cuộc thảo luận về bối cảnh thích hợp cho mỗi thường là một chút mờ; điều này khiến tôi bắt đầu xem xét cách thức thừa kế và đa hình rõ ràng là những khía cạnh riêng biệt của OOP truyền thống.
Đa hình cho phép người ta chỉ định mối quan hệ "là-a" như nhau cũng như thừa kế. Đặc biệt, kế thừa từ một lớp cơ sở ngầm tạo ra một mối quan hệ đa hình giữa lớp đó và các lớp con của nó. Tuy nhiên, trong khi đa hình có thể được thực hiện bằng cách sử dụng giao diện thuần túy, thừa kế làm phức tạp mối quan hệ đa hình bằng cách đồng thời chuyển các chi tiết thực hiện. Bằng cách này, thừa kế khá khác biệt với tính đa hình thuần túy.
Là một công cụ, thừa kế phục vụ các lập trình viên khác biệt so với đa hình (thông qua giao diện tinh khiết) bằng cách đơn giản hóa việc thực hiện tái sử dụng trong trường hợp tầm thường. Tuy nhiên, trong phần lớn các trường hợp, các chi tiết thực hiện của một siêu lớp phụ xung đột một cách tinh tế với các yêu cầu của một lớp con. Đây là lý do tại sao chúng tôi có "ghi đè" và "ẩn thành viên". Trong những trường hợp này, việc tái sử dụng được cung cấp bởi thừa kế được mua với nỗ lực bổ sung của việc xác minh các thay đổi trạng thái và các đường dẫn thực hiện qua các cấp mã: các chi tiết thực hiện "phẳng" hoàn chỉnh của lớp con được trải ra giữa nhiều lớp, thường có nghĩa là nhiều tệp, trong đó chỉ có các phần áp dụng cho lớp con đang được đề cập đến. Nhìn qua hệ thống phân cấp đó là hoàn toàn cần thiết khi giao dịch với thừa kế, bởi vì không nhìn vào mã của siêu lớp, không có cách nào để biết những chi tiết không được ghi đè nào đang làm khỉ với trạng thái của bạn hoặc chuyển hướng thực hiện của bạn.
Để so sánh, việc sử dụng độc quyền bố cục đảm bảo bạn sẽ thấy trạng thái nào có thể được sửa đổi bởi các đối tượng được hiển thị rõ ràng có phương thức được gọi theo ý của bạn. Việc triển khai thực hiện phẳng vẫn chưa đạt được (và thậm chí không thực sự mong muốn, vì lợi ích của lập trình có cấu trúc là đóng gói và trừu tượng hóa các chi tiết triển khai) nhưng bạn vẫn nhận được mã tái sử dụng, và bạn sẽ chỉ phải tìm ở một nơi khi mã lỗi.
Với mục tiêu thử nghiệm những ý tưởng này trong thực tế, tránh thừa kế truyền thống cho một sự kết hợp của tính đa hình giao diện dựa trên tinh khiết và thành phần đối tượng, tôi tự hỏi,
Có thành phần đối tượng bất cứ điều gì và giao diện không thể thực hiện điều đó thừa kế có thể ?
Sửa
Trong các câu trả lời cho đến nay, ewernli tin không có những kỳ công kỹ thuật sẵn sàng cho một kỹ thuật nhưng không phải là khác; sau đó, ông đề cập đến cách thức các mô hình và phương pháp tiếp cận thiết kế khác nhau vốn có đối với từng kỹ thuật. Điều này là lý do. Tuy nhiên, gợi ý này khiến tôi phải tinh chỉnh câu hỏi của mình bằng cách hỏi liệu việc sử dụng độc quyền các thành phần và giao diện thay cho thừa kế truyền thống có ngăn cấm việc sử dụng bất kỳ mẫu thiết kế chính nào không? Và nếu vậy, không có các mẫu tương đương để sử dụng trong tình huống của tôi?
Cá nhân tôi thích mixin. :) –
Tôi không có thời gian để kiểm tra sao chép hiệu quả, nhưng chủ đề thành phần v. Kế thừa này được truy cập thường xuyên trên SO, cho ví dụ. http://stackoverflow.com/questions/216523/object-oriented-best-practices-inheritance-v-composition-v-interfaces hoặc http://stackoverflow.com/questions/1598722/should-i-use-inheritance -hoặc thành phần. “Người ta luôn có thể xoay quanh chủ đề này và gọi nó là một cuốn tiểu thuyết nắm lấy mọi thứ…” Tuy nhiên, một điều chúng ta nên đồng ý là loại câu hỏi này không dẫn đến những câu trả lời dứt khoát hoặc thậm chí có thẩm quyền. Có lẽ một CW có thể là định dạng phù hợp hơn ... – mjv
Tôi không có nghĩa là để rehash một cuộc tranh luận mệt mỏi. Phải thừa nhận rằng, cách tôi tuyên bố trường hợp của tôi là khá nhiều mẫu tranh luận một chiều, nhưng quan tâm chính của tôi là trả lời có hay không có sử dụng cho thừa kế mà không thể thay thế thành phần và giao diện. p.s., định dạng CW là gì? Có lẽ tôi sẽ thử rằng ... –