2010-08-09 34 views
42

Tôi nghe (và đọc trên trang này) rất nhiều về "thành phần ưu tiên hơn thừa kế".Bố cục là gì khi nó liên quan đến thiết kế hướng đối tượng?

Nhưng Compositon là gì? Tôi hiểu sự thừa kế từ điểm của Con người: Động vật có vú: Động vật, nhưng tôi không thể thực sự thấy định nghĩa của Phân hữu ở bất cứ đâu .. Ai đó có thể lấp đầy tôi không?

Trả lời

49

Thành phần đề cập đến việc kết hợp các loại đơn giản để tạo các loại phức tạp hơn. Trong ví dụ của bạn, thành phần có thể là:

Animal: 
    Skin animalSkin 
    Organs animalOrgans 


Mammal::Animal: 
    Hair/fur mammalFur 
    warm-blooded-based_cirulation_system heartAndStuff 

Person::Mammal: 
    string firstName 
    string lastName 

Nếu bạn muốn đi hoàn toàn phần (và thoát khỏi tất cả thừa kế) nó sẽ trông như thế này:

Animal: 
    Skin animalSkin 
    Organs animalOrgans 

Mammal: 
    private Animal _animalRef 
    Hair/fur mammalFur 
    warm-blooded-based_cirulation_system heartAndStuff 

Person: 
    private Mammal _mammalRef 
    string firstName 
    string lastName 

Ưu điểm của phương pháp này là các loại MammalPerson không phải tuân thủ giao diện của cha mẹ trước đó của chúng. Điều này có thể là một điều tốt bởi vì đôi khi một sự thay đổi để siêu lớp có thể có tác động nghiêm trọng trên các lớp con. Họ vẫn có thể truy cập vào các đặc tính và hành vi của các lớp này thông qua các cá thể riêng của chúng trong các lớp này, và nếu chúng muốn phơi bày các hành vi cũ, chúng có thể đơn giản quấn chúng theo một phương thức công khai.

Tôi tìm thấy một liên kết tốt với các ví dụ tốt ở đây: http://www.artima.com/designtechniques/compoinh.html

+4

Vì vậy, tôi có thể nói rằng: "Thành phần là khi tôi tạo một đối tượng' Lớp A' bên trong 'Lớp B' (thay vì phân lớp' Lớp B' từ 'Lớp A')." ? – thesummersign

+0

oh. ok đã nhận nó 'w69rdy' trả lời sau. CÓ Tôi có thể nói điều đó. – thesummersign

31

Thành phần đơn giản là các bộ phận tạo nên toàn bộ. Một chiếc xe có bánh xe, động cơ và ghế ngồi. Thừa kế là một mối quan hệ "là một". Thành phần là mối quan hệ "có một".

+2

Và tập hợp là mối quan hệ .... –

+1

Tổng hợp có thể là thành phần đơn giản hoặc nếu đó là tập hợp những thứ tương tự (ví dụ: bánh xe trên xe hơi), nó có thể được coi là một bộ sưu tập.Một chiếc xe có thể có bốn bánh xe riêng biệt, được xác định duy nhất, hoặc nó có thể có một bộ sưu tập bánh xe. Nó phụ thuộc vào cách sử dụng. Nếu sử dụng một lớp sưu tập, thì bộ sưu tập chính nó là một tập hợp. –

2

Một ví dụ về phần là nơi bạn có một thể hiện của một lớp trong lớp khác, thay vì kế thừa từ nó

This trang có một bài viết tốt giải thích tại sao người ta nói "thành phần có lợi cho cơ nghiệp" với một số ví dụ về tại sao.

+1

Không thực sự * một thể hiện của một lớp [C2] trong một lớp khác [C1] * nhưng * một ** instance ** của một lớp trong ** instance ** của một lớp * khác. Trước đây có thể bị hiểu lầm như thể bạn đã khởi tạo C2 khi định nghĩa C1, điều này không nên phổ biến. –

14

Có ba cách để cung cấp cho hành vi để một lớp. Bạn có thể viết hành vi đó vào trong lớp; bạn có thể kế thừa từ một lớp có hành vi mong muốn; hoặc bạn có thể kết hợp một lớp với hành vi mong muốn vào lớp của bạn dưới dạng một trường hoặc biến thành viên. Hai phần cuối cùng đại diện cho các hình thức sử dụng lại mã và thành phần cuối cùng - thường được ưu tiên. Nó không thực sự cung cấp cho lớp của bạn hành vi mong muốn - bạn vẫn cần gọi phương thức trên trường - nhưng nó đặt ít ràng buộc hơn vào thiết kế lớp của bạn và kết quả dễ kiểm tra và dễ dàng hơn để gỡ lỗi mã. Thừa kế có vị trí của nó, nhưng thành phần nên được ưa thích.

+1

+1: Thành phần là vua. –

11
class Engine 
{ 

} 

class Automobile 
{ 

} 


class Car extends Automobile // car "is a" automobile //inheritance here 
{ 
Engine engine; // car "has a" engine //composition here 

} 

Thành phần - Chức năng của một đối tượng được tạo thành từ một tổng hợp của các tầng lớp khác nhau. Trong thực tế, điều này có nghĩa là giữ một con trỏ đến một lớp khác mà công việc được hoãn lại.

Thừa kế - Chức năng của đối tượng được tạo thành từ chức năng riêng của nó cộng với chức năng từ các lớp cha mẹ.

Vì sao thành phần được ưu tiên hơn thừa kế, hãy xem Circle-ellipse problem.

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