2013-09-28 2 views
2

Я искал ответ о том, что может быть простым примером кода композиции. Я знаю различия в составе и наследовании, но я не могу понять это с помощью кода.Зачем использовать композицию?

Любой пример сравнения (с использованием обоих подходов) о том, почему я должен использовать композицию, будет очень полезен.

Заранее спасибо

+0

Я думаю, получили ответы из приведенных ниже ссылок. В основном моя забота заключалась в том, как концепция изменения метода базового класса может повлиять на то, следует ли нам использовать наследование или состав. –

+0

И я думаю, что если мы будем использовать наследование и в случае каких-либо изменений в функции базового класса, это повлияет на код вызывающего клиента. Но если бы мы использовали композицию, изменение функции базового класса потребовало бы, чтобы мы изменили класс, используя его. Клиентский код остался бы прежним. Другим моментом является использование наследования только в том случае, если мы должны использовать всю функциональность базового класса. Повторю еще раз, что моя главная забота о начале этой темы снова была связана с изменением функциональности базового класса. –

ответ

1

Вы можете, вероятно, хотите, чтобы проверить Composition over inheritance

В пользу композиции над наследованием является принцип конструкции, что дает дизайн более высокую гибкость, предоставляя бизнес-доменные классы и более стабильной области бизнеса в долгосрочной перспективе срок. Другими словами, HAS-A может быть лучше, чем IS-A отношений

Проверить ответ aleemb в related post, в котором он объясняет разницу с примером кода

Вот полезный link, который объясняет, почему предпочитают композицию над наследованием

Хотя и композиция, и наследование позволяют повторно se code, одним из недостатков Inheritance является то, что он разрушает инкапсуляцию. Если подкласс находится в зависимости от поведения суперкласса для его работы, он внезапно становится хрупким. Когда поведение суперклассов меняется, функциональность в подклассе может быть сломана, без каких-либо изменений со своей стороны. Одним из примеров ненадежного кода наследования является метод add() и addAll() из HashSet. Предположим, если addAll() из HashSet реализуется путем вызова метода add(), и вы пишете подкласс класса HashSet, который шифрует содержимое перед вставкой в ​​HashSet. Поскольку есть только один метод add(), который может вставлять объект в HashSet, вы переопределяете этот метод и называете свой метод encrypt() переопределением add(). Это автоматически также охватывает addAll(), потому что addAll() реализуется с помощью add(), он выглядит очень заманчивым. Если вы посмотрите внимательно, вы увидите, что эта реализация хрупка, потому что она полагалась на поведение суперкласса. Если базовый класс хочет повысить производительность и реализует addAll() без вызова метода add(), ниже пример будет разорван.

public class EncryptedHashSet extends HashSet{ 
..... 

public boolean add(Object o) { 
    return super.add(encrypt(o)); 
} 

} 

Если вы использовали композиции в пользу наследования вы не столкнетесь с этой проблемой, и ваш класс был бы более надежным, потому что вы не полагаться на супер поведение класса больше. Вместо этого вы используете метод суперкласса для добавления части и вы будете пользоваться с любого улучшения addAll(), как показано в примере ниже:

public class EncryptedHashSet implements Set{ 
private HashSet container; 

public boolean add(Object o) { 
    return container.add(encrypt(o)); 
} 

public boolean addAll(Collection c) { 
    return conatainer.add(encrypt(c)); 
} 

....... 
} 
1

Основное отличие состоит в том, что наследование устанавливает иерархию классов во время компиляции, в то время как композиция позволяет решить отношения составленное класса во время выполнения.

С наследованием код, который он исправил с иерархией наследования. Например, If We inherit Circle класс от Shape класс, Shape фиксирован как базовый класс для класса Circle.

Предположим, мы дополнительно классифицируем форму как 2DShape, и 3DShape. Теперь с наследованием класс Circle не наследуется от 2DShape.

С композицией можно. Таким образом, вы можете изменить составной класс на любой производный тип скомпонованного класса во время выполнения.

0

Я думаю, что Джошуа Блох говорит, что лучше: Item 16: Favor composition over inheritance

+0

Все ответы, высказанные вами вами, были очень полезны. Но почему-то я не могу отметить все ответы. Еще спасибо за ответы, ребята, они были действительно полезны. Еще одна вещь, я бы хотел, чтобы вы, ребята, чтобы проверить мой ответ, ПОСЛЕ ТОЛЬКО ПОСЛЕ МОЙ ВОПРОС выше, и дайте мне знать, правильно ли я понимаю или нет. –

Смежные вопросы