Вы можете, вероятно, хотите, чтобы проверить 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));
}
.......
}
Я думаю, получили ответы из приведенных ниже ссылок. В основном моя забота заключалась в том, как концепция изменения метода базового класса может повлиять на то, следует ли нам использовать наследование или состав. –
И я думаю, что если мы будем использовать наследование и в случае каких-либо изменений в функции базового класса, это повлияет на код вызывающего клиента. Но если бы мы использовали композицию, изменение функции базового класса потребовало бы, чтобы мы изменили класс, используя его. Клиентский код остался бы прежним. Другим моментом является использование наследования только в том случае, если мы должны использовать всю функциональность базового класса. Повторю еще раз, что моя главная забота о начале этой темы снова была связана с изменением функциональности базового класса. –