Рубрики
Без рубрики

Состав против наследования

Состав против наследования. Композиция по наследству. Почему предпочтение отдается композиции, а не наследованию – узнайте на примерах программ java

Автор оригинала: Pankaj Kumar.

Композиция против наследования-один из часто задаваемых вопросов для интервью. Вы, должно быть, также слышали об использовании композиции вместо наследования.

Состав против наследования

Как композиция, так и наследование являются концепциями объектно-ориентированного программирования . Они не связаны с каким-либо конкретным языком программирования, таким как Java. Прежде чем мы сравним композицию с наследованием программно, давайте быстро определим их.

Композиция

Композиция-это метод проектирования в объектно-ориентированном программировании для реализации имеет отношения между объектами. Композиция в java достигается за счет использования переменных экземпляра других объектов. Например, человек, у которого есть работа, реализован, как показано ниже, в объектно-ориентированном программировании java.

package com.journaldev.composition;

public class Job {
// variables, methods etc.
}
package com.journaldev.composition;

public class Person {

    //composition has-a relationship
    private Job job;

    //variables, methods, constructors etc. object-oriented

Наследование

Наследование-это метод проектирования в объектно-ориентированном программировании для реализации is-a отношений между объектами. Наследование в Java реализовано с использованием ключевого слова extends.

Например, Cat-это отношение к животным в программировании на Java, которое будет реализовано, как показано ниже.

package com.journaldev.inheritance;
 
public class Animal {
// variables, methods etc.
}
package com.journaldev.inheritance;
 
public class Cat extends Animal{
}

Композиция по наследству

Как композиция, так и наследование способствуют повторному использованию кода с помощью различных подходов. Так какой же из них выбрать? Как сравнить состав и наследование. Вы, должно быть, слышали, что в программировании следует отдавать предпочтение композиции, а не наследованию. Давайте рассмотрим некоторые из причин, которые помогут вам в выборе композиции против наследования.

  1. Наследование тесно связано, в то время как композиция слабо связана. Давайте предположим, что у нас есть нижеперечисленные классы с наследованием.

    Для простоты у нас есть как суперкласс, так и подкласс в одном пакете. Но в основном они будут находиться в отдельной кодовой базе.

    Может быть много классов, расширяющих класс суперкласса. Очень распространенным примером такой ситуации является расширение класса исключений.

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

    Как только вы начнете использовать реализацию нового класса, вы получите ошибку времени компиляции в классе B, поскольку Тип возвращаемого значения несовместим с ClassA.bar() . Решением было бы изменить метод суперкласса или подкласса bar (), чтобы сделать их совместимыми.

    Если бы вы использовали композицию вместо наследования, вы никогда не столкнулись бы с этой проблемой. Простым примером реализации класса B с использованием композиции может быть, как показано ниже.

  2. В наследовании нет контроля доступа, в то время как доступ может быть ограничен по составу. Мы предоставляем все методы суперкласса другим классам, имеющим доступ к подклассу. Поэтому, если вводится новый метод или в суперклассе есть дыры в безопасности, подкласс становится уязвимым. Поскольку в композиции мы выбираем, какие методы использовать, это более безопасно, чем наследование. Например, мы можем предоставить доступ к методу класса A foo() другим классам, используя приведенный ниже код в классе B.

    Это одно из главных преимуществ композиции перед наследованием.

  3. Композиция обеспечивает гибкость в вызове методов, что полезно в сценарии с несколькими подклассами. Например, предположим, что у нас есть сценарий наследования ниже.

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

    Это даст вам возможность гибко использовать любой подкласс на основе объекта, используемого в конструкторе.

  4. Еще одним преимуществом композиции по сравнению с наследованием является область тестирования. Модульное тестирование легко по составу, потому что мы знаем, какие все методы мы используем из другого класса. Мы можем смоделировать его для тестирования, тогда как в наследовании мы сильно зависим от суперкласса и не знаем, какие все методы суперкласса будут использоваться. Поэтому нам придется протестировать все методы суперкласса. Это дополнительная работа, и мы должны делать ее без необходимости из-за наследования.

Это все для композиции против наследования. У вас достаточно причин, чтобы предпочесть композицию наследованию. Используйте наследование только тогда, когда вы уверены, что суперкласс не будет изменен, в противном случае переходите к составу.