Nó không phải là một vấn đề trong số đó là tốt nhất, nhưng khi sử dụng những gì.
Trong trường hợp 'bình thường', một câu hỏi đơn giản là đủ để tìm hiểu xem chúng ta có cần thừa kế hay tổng hợp hay không.
- Nếu lớp mới là nhiều hơn hoặc ít hơn với lớp gốc. Sử dụng thừa kế. Lớp mới bây giờ là một lớp con của lớp gốc.
- Nếu lớp mới phải có lớp gốc. Sử dụng tổng hợp. Lớp học mới bây giờ là lớp học ban đầu với tư cách là một thành viên.
Tuy nhiên, có một khu vực màu xám lớn. Vì vậy, chúng tôi cần một số thủ thuật khác.
- Nếu chúng tôi đã sử dụng thừa kế (hoặc chúng tôi dự định sử dụng) nhưng chúng tôi chỉ sử dụng một phần của giao diện hoặc chúng tôi buộc phải ghi đè rất nhiều chức năng để giữ mối tương quan logic. Sau đó, chúng tôi có một mùi khó chịu lớn cho thấy rằng chúng tôi đã phải sử dụng tập hợp.
- Nếu chúng tôi đã sử dụng tổng hợp (hoặc chúng tôi dự định sử dụng nó) nhưng chúng tôi tìm ra chúng tôi cần phải sao chép gần như tất cả các chức năng. Sau đó, chúng tôi có một mùi mà điểm theo hướng thừa kế.
Để cắt ngắn. Chúng ta nên sử dụng tập hợp nếu một phần của giao diện không được sử dụng hoặc phải được thay đổi để tránh tình huống phi logic. Chúng ta chỉ cần sử dụng thừa kế, nếu chúng ta cần gần như tất cả các chức năng mà không có thay đổi lớn. Và khi nghi ngờ, hãy sử dụng Aggregation.
Một khả năng khác, trường hợp chúng tôi có một lớp cần một phần chức năng của lớp gốc, là chia lớp gốc thành lớp gốc và lớp con. Và để cho lớp mới kế thừa từ lớp gốc. Nhưng bạn nên cẩn thận với điều này, không phải để tạo ra sự tách biệt phi logic.
Cho phép thêm ví dụ. Chúng tôi có một lớp 'Chó' với các phương pháp: 'Ăn', 'Đi bộ', 'Vỏ cây', 'Chơi'.
class Dog
Eat;
Walk;
Bark;
Play;
end;
Bây giờ chúng ta cần một lớp 'Mèo', cần 'Ăn', 'Đi bộ', 'Purr' và 'Phát'. Vì vậy, trước tiên hãy thử mở rộng nó từ một con chó.
class Cat is Dog
Purr;
end;
Có vẻ, được rồi, nhưng chờ đã. Con mèo này có thể Bark (những người yêu mèo sẽ giết tôi vì điều đó). Và một con mèo sủa sủa vi phạm các nguyên tắc của vũ trụ. Vì vậy, chúng ta cần phải ghi đè lên phương pháp Bark để nó không có gì.
class Cat is Dog
Purr;
Bark = null;
end;
Ok, công trình này, nhưng nó có mùi xấu. Vì vậy, hãy thử tập hợp:
class Cat
has Dog;
Eat = Dog.Eat;
Walk = Dog.Walk;
Play = Dog.Play;
Purr;
end;
Ok, điều này thật tuyệt. Con mèo này không sủa nữa, thậm chí không im lặng. Nhưng nó vẫn có một con chó nội bộ muốn ra ngoài. Vì vậy, hãy thử giải pháp số ba:
class Pet
Eat;
Walk;
Play;
end;
class Dog is Pet
Bark;
end;
class Cat is Pet
Purr;
end;
Điều này sạch hơn nhiều. Không có chó nội bộ. Và chó và mèo ở cùng cấp độ. Chúng tôi thậm chí có thể giới thiệu các vật nuôi khác để mở rộng mô hình. Trừ khi nó là một con cá, hay cái gì đó không đi. Trong trường hợp đó, chúng ta lại cần tái cấu trúc lại. Nhưng đó là một cái gì đó cho một thời gian khác.
Câu hỏi hay, rất tiếc là hiện tại tôi không có đủ thời gian. –
Câu trả lời hay hơn là câu trả lời nhanh hơn ... Tôi sẽ xem câu hỏi của riêng tôi vì vậy tôi sẽ bầu cho bạn ít nhất :-P –
Nó được mở rộng ngay bây giờ ;-). –