Забавный факт: концепция «наследования» в ООП была вдохновлена ​​биологическим наследованием, которое мы наблюдаем в животном мире. Точно так же, как характеристики и черты передаются от родителей к их потомкам в природе, ООП позволяет классам наследовать свойства и поведение от своих родительских классов.

Отбросив мелочи, давайте сразу к главному. Цель этого поста (кроме того, чтобы выставлять напоказ мои забавные факты) — поделиться уникальной точкой зрения на ООП, которую многие разработчики не могут распознать, особенно когда пытаются понять структуру и назначение концепций ООП в первый раз. На мой взгляд, объектно-ориентированное программирование (ООП) — это средство для создания надежных систем с помощью многоразовых модульных компонентов, которые соединяются в иерархическую структуру.

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

Типа Лего.

Моя аналогия с Lego, возможно, неверна, но если вы уже знакомы с особенностями ООП, то вы знаете, что объектно-ориентированные системы будут основаны на принципах объектно-ориентированного программирования (ООП), представляющего собой парадигму программирования, которая организует разработку программного обеспечения вокруг объекты, объекты, которые могут содержать данные и поведение, объекты, созданные на основе базовой схемы, также известной как класс. Эти объекты предназначены для хранения соответствующих данных и поведения, как и их реальный аналог.

Теперь самое время спросить: понимаете ли вы, что объектно-ориентированное программирование (ООП) использует иерархические отношения для организации и структурирования своих классов и объектов? Это делает мой друг, это делает. Существует четкая иерархическая связь, установленная посредством наследования, когда классы организованы в виде иерархической древовидной структуры. Классы, находящиеся выше в иерархии (суперклассы или базовые классы), предоставляют общие свойства и поведение, которые могут быть унаследованы классами, расположенными ниже в иерархии (подклассы или производные классы). Это средство продвижения повторного использования кода, модульности и возможности моделировать отношения в реальном мире.

Хорошо, проверьте это. Скажем, вы хотите моделировать различные типы транспортных средств. Вы можете определить надкласс под названием Vehicle, который предоставляет общие свойства и поведение для всех типов транспортных средств. Таким образом, вам не придется разрабатывать эти поведения или свойства заново в каждом подклассе Vehicle. Наследование — это настоящая возможность повторного использования, если вы спросите меня.

Проверьте это, Транспортное средство станет средством наследования:

public class Vehicle {
    private String brand;
    private String color;
    private int year;
    public Vehicle(String brand, String color, int year) {
        this.brand = brand;
        this.color = color;
        this.year = year;
    }
    public void accelerate() {
        System.out.println("The vehicle is accelerating.");
    }
    public void brake() {
        System.out.println("The vehicle is braking.");
    }
}

Теперь давайте создадим два подкласса Car и Motorcycle, которые наследуются от класса Vehicle:

public class Car extends Vehicle {
    private int numberOfDoors;
    public Car(String brand, String color, int year, int numberOfDoors) {
        super(brand, color, year);
        this.numberOfDoors = numberOfDoors;
    }
    public void openTrunk() {
        System.out.println("Opening the car trunk.");
    }
}
public class Motorcycle extends Vehicle {
    private boolean hasSidecar;
    public Motorcycle(String brand, String color, int year, boolean hasSidecar) {
        super(brand, color, year);
        this.hasSidecar = hasSidecar;
    }
    public void doWheelie() {
        System.out.println("Performing a wheelie with the motorcycle.");
    }
}

Ты видишь? Car и Motorcycle являются подклассами Vehicle, унаследовавшими свойства (brand, color, year) и поведение (accelerate(), brake()) от суперкласса. Это еще не все, унаследованные свойства и поведение могут быть изменены (полиморфизм), чтобы соответствовать уникальности каждого объекта.

Посмотрите, как конструкторы используются ниже для предоставления уникальных и конкретных данных при создании объекта. Теперь объекты; «автомобиль» и «мотоцикл», созданные ниже, содержат данные и поведение, которые используются здесь для представления его объектов реального мира.

public class Main {
    public static void main(String[] args) {
        Car car = new Car("Toyota", "Red", 2022, 4);
        car.accelerate();   // Inherited from Vehicle class
        car.brake();        // Inherited from Vehicle class
        car.openTrunk();    // Unique to Car class
        System.out.println();
        Motorcycle motorcycle = new Motorcycle("Honda", "Black", 2021, false);
        motorcycle.accelerate();   // Inherited from Vehicle class
        motorcycle.brake();        // Inherited from Vehicle class
        motorcycle.doWheelie();    // Unique to Motorcycle class
    }
}

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

ПРИМЕЧАНИЕ. Существуют различные способы демонстрации иерархической связи объектов реального мира с ООП. Некоторые примеры можно найти ниже, эти примеры могут служить руководством для понимания связи между объектно-ориентированными системами и системами реального мира.

ИЕРАРХИЧЕСКАЯ ОТНОШЕНИЕ КЛАСС-ОБЪЕКТ

Иерархия животных:

  1. Класс: Животное
  2. Объекты: лев, тигр, леопард (объекты разных типов из класса Animal)

Иерархия транспортных средств:

  1. Класс: Автомобиль
  2. Объекты: автомобиль, мотоцикл, грузовик (объекты разных типов из класса Vehicle)

Иерархия формы:

  1. Класс: Форма
  2. Объекты: круг, прямоугольник, треугольник (объекты разных типов из класса Shape)

Иерархия сотрудников:

  1. Класс: Сотрудник
  2. Объекты: менеджер, разработчик, дизайнер (объекты разных типов из класса Employee)

ИЕРАРХИЧЕСКАЯ ОТНОШЕНИЕ «HAS-A» (агрегация, ассоциация и композиция).

Иерархия автосалонов:

  1. Класс: Автосалон
  2. Ассоциация: CarDealership имеет клиентов (Ассоциация)
  3. Агрегация: у CarDealership есть продавцы (агрегация)
  4. Композиция: CarDealership имеет CarInventory (Композиция)

Иерархия социальных сетей:

  1. Класс: SocialMediaPlatform
  2. Ассоциация: SocialMediaPlatform имеет пользователей (ассоциация)
  3. Агрегация: SocialMediaPlatform имеет сообщения (агрегация)
  4. Композиция: Пост имеет комментарии (Композиция)

ИЕРАРХИЧЕСКИЕ ОТНОШЕНИЯ «ЕС-А» (Наследование)

Иерархия животных:

  1. Суперкласс: Животное
  2. Подклассы: млекопитающее, рептилия, птица
  3. Другие подклассы: Собака, Кошка, Змея, Орел

Иерархия транспортных средств:

  1. Суперкласс: Транспортное средство
  2. Подклассы: Автомобиль, Мотоцикл, Грузовик
  3. Другие подклассы: седан, внедорожник, спортивный автомобиль, круизер, пикап.