Thành phần là khi một lớp cung cấp một số chức năng bằng cách khởi tạo một lớp (có thể là nội bộ) đã thực hiện chức năng này, thay vì kế thừa từ lớp đó.
Vì vậy, ví dụ, nếu bạn có một lớp mô hình một con tàu, và bây giờ bạn được thông báo rằng con tàu của bạn nên cung cấp một sân bay trực thăng, không phải tự nhiên mà lấy được con tàu của bạn từ một sân bay trực thăng, thay vào đó, bạn nên có tàu của bạn chứa một lớp sân bay trực thăng và phơi bày nó thông qua một số Ship.getHelipad()
phương pháp.
Trong những năm cũ (một thập kỷ trước đây), người ta thường xem thừa kế là một cách nhanh chóng và dễ dàng để tổng hợp chức năng, do đó, có rất nhiều ví dụ về loại "tàu được thừa hưởng từ sân bay trực thăng", tất nhiên, rất khập khiễng.
Nhưng dictum "Thành phần ủng hộ thừa kế" đã được diễn đạt cẩn thận để làm rõ rằng đây chỉ là một gợi ý, không phải là một quy tắc. Tác giả của cuốn sách đã đủ cẩn thận để không nói điều gì đó như "ngươi sẽ không bao giờ sử dụng sự kế thừa, chỉ thành phần". Điều này về cơ bản mang đến sự chú ý của cộng đồng công nghệ phần mềm, thực tế là tính kế thừa đã bị lạm dụng quá mức, trong khi trong nhiều trường hợp, thành phần tạo ra các thiết kế rõ ràng, thanh lịch và có thể bảo trì hơn là kế thừa.
Vì vậy, về cơ bản, bản tóm tắt "Thành phần ủng hộ thừa kế" đang gợi ý rằng bất cứ khi nào bạn phải đối mặt với "kế thừa hoặc sáng tác?" Câu hỏi, bạn nên suy nghĩ kỹ chiến lược phù hợp nhất là gì, và hầu hết các cơ hội là chiến lược phù hợp nhất sẽ trở thành thành phần chứ không phải kế thừa.
Nhưng vì đây không phải là một quy tắc, bạn cũng nên nhớ rằng có nhiều trường hợp thừa kế là tự nhiên hơn. Nếu bạn sử dụng thành phần ở đó nơi bạn nên sử dụng tính kế thừa, nhiều tệ nạn sẽ xảy ra với mã của bạn.
Để quay trở lại ví dụ về tàu, nếu tàu của bạn cần cung cấp giao diện để tương tác với a FloatingMachine
, thì việc lấy nó từ một FloatingMachine
lớp trừu tượng , điều rất có thể đến từ Machine
lớp trừu tượng khác .
Dưới đây là quy tắc ngón tay cái cho câu trả lời cho thành phần so với câu hỏi thừa kế:
Lớp của tôi có mối quan hệ "là" với giao diện mà nó cần phơi bày không? Nếu có, sử dụng thừa kế. Nếu không, sử dụng thành phần.
Một con tàu "là một" máy nổi và một máy nổi "là một" máy. Vì vậy, thừa kế là hoàn toàn tốt cho những người. Nhưng một con tàu dĩ nhiên không phải là sân bay trực thăng. Vì vậy, nó tốt hơn soạn các chức năng của sân bay trực thăng.