Отношение наследования (IS-A) и состава (HAS-A)

Описание

Одним из преимуществ объектно-ориентированного языка программирования является повторное использование кода. Есть два способа повторного использования кода: реализация наследования (отношение IS-A) или композиция объектов (отношение HAS-A). Хотя компилятор и виртуальная машина Java (JVM) будут делать за вас много работы, когда вы используете наследование, вы также можете получить функциональность наследования при использовании композиции.

Отношение IS-A:

В объектно-ориентированном программировании концепция IS-A полностью основана на наследовании, которое может быть двух типов: наследование класса или наследование интерфейса. Это все равно, что сказать: «А относится к типу Б». Например, Apple — это фрукт, автомобиль — это средство передвижения и т. Д. Наследование является однонаправленным. Например, Дом — это здание. Но здание — это не дом.

Важно отметить, что вы можете легко определить связь IS-A. Где бы вы ни видели ключевое слово extends или ключевое слово реализации в объявлении класса, считается, что этот класс имеет отношение IS-A.

Отношение HAS-A:

Композиция (HAS-A) просто означает использование переменных экземпляра, которые являются ссылками на другие объекты. Например, у Maruti есть Engine, а у House — ванная.

Давайте разберемся с этими концепциями на примере класса Car.

  отношения между пакетами; class Car {//Реализация методов  и члены класса/экземпляра: private String color; private int maxSpeed;  public void carInfo () {System.out.println ("Car Color =" + color + "Max Speed ​​=" + maxSpeed);} public void setColor (String color) {this.color = color;} public void setMaxSpeed ​​(int  maxSpeed) {this.maxSpeed ​​= maxSpeed;}}  

Как показано выше, класс Car имеет пару переменных экземпляра и несколько методов. Maruti — это особый тип автомобилей, который расширяет класс Car, что означает Maruti IS-A Car.

  class Maruti расширяет Car {//Maruti расширяет Car и, таким образом, наследует все методы от Car (кроме final и static)//Maruti также может определять все свои конкретные функции public void MarutiStartDemo (  ) {Engine MarutiEngine = new Engine (); MarutiEngine.start ();}}  

Класс Maruti использует метод start () объекта Engine через композицию. Можно сказать, что Maruti class HAS-A Engine.

  отношения между пакетами; открытый класс Engine {public void start () {System.out.println ("Engine Started:");} public void stop () {System.out  .println ("Двигатель остановлен:");}}  

Класс RelationsDemo создает объект класса Maruti и инициализирует его. Хотя в классе Maruti нет методов setColor (), setMaxSpeed ​​() и carInfo (), мы можем использовать его из-за связи IS-A класса Maruti с классом Car.

  отношения пакетов; открытый класс RelationsDemo {public static void main (String [] args) {Maruti myMaruti = new Maruti (); myMaruti.setColor ("RED"); myMaruti. setMaxSpeed ​​(180); myMaruti.carInfo (); myMaruti.MarutiStartDemo ();}}  

Если мы запустим класс RelationsDemo, мы увидим результат, как показано ниже.

Сравнение композиции и наследования

  • Изменить класс, реализующий композицию, проще, чем наследование. Изменение суперкласса влияет на иерархию наследования подклассов.
  • Вы не можете добавить к подклассу метод с той же сигнатурой, но с другим типом возвращаемого значения, как метод, унаследованный от суперкласса. С другой стороны, композиция позволяет изменять интерфейс интерфейсного класса, не затрагивая внутренние классы.
  • Композиция — это динамическая привязка (привязка во время выполнения), а наследование — это статическая привязка. (привязка времени компиляции)
  • Легче добавлять новые подклассы (наследование), чем добавлять новые внешние классы (состав), потому что наследование происходит с полиморфизмом. Если у вас есть фрагмент кода, который полагается только на интерфейс суперкласса, этот код может работать с новым подклассом без изменений. Это не относится к композиции, если вы не используете композицию с интерфейсами. При совместном использовании композиция и интерфейсы представляют собой очень мощный инструмент дизайна.
  • При использовании как композиции, так и наследования легко изменить реализацию (не интерфейс) любого класса. Эффект пульсации изменений реализации остается внутри того же класса.
    • Не используйте наследование только для повторного использования кода. Если все, что вам действительно нужно состоит в том, чтобы повторно использовать код, и здесь нет никаких отношений, используйте композицию.
    • Не используйте наследование только для того, чтобы получить полиморфизм. Если все вы действительно want — это полиморфизм, но нет естественных отношений is-a, используйте композицию с интерфейсами.

Резюме

  • Отношение IS-A, основанное на наследовании, которое может быть двух типов: наследование класса или наследование интерфейса.
  • Отношение Has-a — это отношение композиции, которое является продуктивный способ повторного использования кода.

Оцените статью
nanomode.ru
Добавить комментарий