Đây không phải là vấn đề tốt nhất, mà là khi nào nên sử dụng cái 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ế hoặc tổng hợp hay không.
- Nếu Lớp mới là nhiều hơn hoặc ít hơn như 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 ban đầu.
- Nếu lớp mới phải có lớp gốc. Sử dụng tổng hợp. Lớp mới hiện có lớp ban đầu là 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 tính kế thừa (hoặc chúng tôi dự định sử dụng nó) 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ữ cho mối tương quan hợp lý. Sau đó, chúng ta có một mùi khó chịu lớn cho thấy rằng chúng ta phải sử dụng tổng 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 thấy rằng chúng tôi cần sao chép gần như tất cả các chức năng. Sau đó, chúng ta có một mùi chỉ theo hướng thừa kế.
Để cắt nó ngắn. Chúng ta nên sử dụng tổng hợp nếu một phần của giao diện không được sử dụng hoặc phải thay đổi để tránh tình huống phi logic. Chúng ta chỉ cần sử dụng tính kế thừa, 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 Uẩn.
Một khả năng khác, trong trường hợp chúng ta có một lớp cần một phần chức năng của lớp gốc, là tách lớp gốc trong lớp gốc và lớp phụ. 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 tạo ra một sự tách biệt phi logic.
Hãy thêm một ví dụ. Chúng tôi có một lớp 'Chó' với các phương pháp: 'Ăn', 'Đi bộ', 'Bark', '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à 'Chơi'. Vì vậy, trước tiên hãy cố gắng mở rộng nó từ một con chó.
class Cat is Dog
Purr;
end;
Có vẻ, ổn, nhưng chờ đợi. 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 vi phạm các nguyên tắc của vũ trụ. Vì vậy, chúng ta cần ghi đè phương thức Bark để nó không làm gì cả.
class Cat is Dog
Purr;
Bark = null;
end;
Ok, nó hoạt động, nhưng nó có mùi hôi. Vì vậy, hãy thử tổng hợp:
class Cat
has Dog;
Eat = Dog.Eat;
Walk = Dog.Walk;
Play = Dog.Play;
Purr;
end;
Ok, điều này là tốt đẹp. 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 là sạch sẽ hơn nhiều. Không có chó nội. Và mèo và chó ở 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á, hoặc một cái gì đó không đi bộ. Trong trường hợp đó chúng ta lại cần tái cấu trúc. Nhưng đó là một cái gì đó cho một thời gian khác.