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

В данной статье будет рассказано о том, что собой представляет объектно-ориентированное программирование. Особое внимание уделено наследованию классов и иных элементов. Предложенные сведения окажутся одинаково полезны и новичкам, и продвинутым разработчикам. Акцент будет сделан на Си-семействе (С++), а также Java. Это – непревзойденные лидеры в области ООП.

ООП – определение

Это – специализированная методология программирования, которая опирается на представлении программы в виде некой связи взаимодействующий между собой объектов. Каждый из них – это экземпляр определенного класса. Классы будут образовывать иерархию наследования, о которой сказано далее.

Идеологически объектно-ориентированное программирование – это подход к написанию исходного кода утилиты как к моделированию информационных объектов. На новом уровне они решают основную задачу структурного программирования. Этот прием позволяет добиться быстрых и эффективных результатов в крупных проектах.

Принципы ООП

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

Вот основные принципы:

  1. Абстракция. Помогает выделять в моделируемом предмете важного для решения конкретных задач. В итоге понимание объекта будет трактоваться в виде класса.
  2. Инкапсуляция. Обеспечивает быструю и безопасную организацию иерархической управляемости. Тут ведется уточнение «что делать», а не «как добиться цели».
  3. Наследование. Весьма важный процесс, позволяющий организовывать родственные понятия. На каждом шаге иерархии должны быть понятны только необходимые корректировки, без дублирования «оставшихся» элементов кода.
  4. Полиморфизм. Нужен для того, чтобы определять точки, в которых единое управление лучше распараллелить или наоборот – скомпоновать в единое целое.

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

Терминология

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

  1. Алгоритм – принцип или правила, которые необходимы для достижения изначально поставленной задачи.
  2. API – интерфейс прикладного программирования. Представлен правилами, протоколами и процедурами, необходимыми для написания контента. Помогает приложениям взаимодействовать друг с другом.
  3. Аргументы – значения, передаваемые в функции и команды.
  4. Символы – элементарные единицы отображения электронных материалов. Выражаются цифирными или буквенными записями.
  5. Объект – набор связанных переменных, структур данных, а также констант. Они будут отобраны и совместно обработаны утилитой.
  6. Класс – набор связанных между собой объектов. У таких компонентов есть общие свойства (public).
  7. Константы – переменные (значения), которые не меняются на протяжении выполнения кода программы.
  8. Тип данных – способ классификации информации электронного характера определенного типа.
  9. Переменная – именованная ячейка выделенной памяти. Может при обработке кода считываться, сохраняться, изменяться согласно представленным программером алгоритмам.
  10. Массив – списки схожих типов значений, заранее прошедшие процедуру группировки. Множество информации.
  11. Фреймворк – готовый блок кода, используемый для ускорения написания программы. Может корректироваться разработчиком «под себя». Вмещает API, а также классы и объекты, иные инструменты.
  12. Оператор – объект, манипулирующий операндами.
  13. Операнд – элемент кода, которым можно управлять через специальные компоненты: операторы.
  14. Указатели – переменные с адресом места в памяти. Обладают уникальными именами.
  15. Пакет – организованный модель связанных интерфейсов и классов. Помогают организовывать классы, которые относятся к одной и той же категории или предоставляют соответствующие функциональные возможности.

Отдельно можно выделить понятие синтаксиса – это правила и принципы передачи операторов. То, как должен быть написан исходных код.

Наследование – что это

При разборе тем, посвященных методам коддинга и ООП, важно обратить внимание на наследование. Это – одна из основ объектно-ориентированного программирования. При помощи нее класс сможет использовать переменные и методы другого класса, словно собственные.

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

Класс, который дает «базу» для наследования» — суперкласс или базовые. Может называться родительским (или просто «родителем»).

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

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

Каждый язык программирования предусматривает свои особенности и нюансы применения наследования классов. Далее будет приведен пример на C++, а затем – опубликована полезная информация для разработчиков на Java.

В Си Плюс-Плюс выделяются несколько типов наследования:

  1. Публичный. Это – public class. Здесь есть общие (public) и защищенные (protected) данные. Они будут наследоваться без корректировки изначально предусмотренного уровня доступа к оным.
  2. Защищенный. Носит название protected. Вся информация, которая была унаследована, получит статус «защищенной».
  3. Приватный – private. Все передаваемые электронные материалы будут «приватными».

Чтобы лучше понимать принципы и методы их работы, стоит рассмотреть наглядный пример. В нем для базового класса Device уровень доступа к электронным материалам остается неизменным. Связано это с тем, что производный класс Computer будет наследовать сведения в виде приватных. Информация для класса Computer будет приватной.

Вот так будет выглядеть пример:

#include <iostream>
using namespace std;

class Device {
    public:
        int serial_number = 12345678;

        void turn_on() {
            cout << "Device is on" << endl;
        }
};

class Computer: private Device {
    public:
        void say_hello() {
            turn_on();
            cout << "Welcome to Windows 95!" << endl;
        }
};

int main() {
    Device Device_instance;
    Computer Computer_instance;

    cout << "\t Device" << endl;
    cout << "Serial number is: "<< Device_instance.serial_number << endl;
    Device_instance.turn_on();

    // cout << "Serial number is: " << Computer_instance.serial_number << endl;
    // Computer_instance.turn_on();
    // will cause compile time error

    cout << "\t Computer" << endl;
    Computer_instance.say_hello();
    return 0;
}

Здесь:

  1. Класс Computer будет использовать метод turn_on() точно так же, как и любой приватный.
  2. Turn_on может быть вызван внутри класса. Попытка обратиться к нему напрямую через main повлечет за собой ошибку во время компилирования.
  3. Для родительского класса Device метод turn_on выступает в качестве публичного. Он может быть вызван из main.

Все это наглядно объясняет типы наследования в C++.

Конструкторы и деструкторы

Конструкторы и деструкторы в C++ не проходят стадию наследования. Они могут быть вызваны, если дочерний класс будет инициализировать свой объект. Конструкторы будут вызываться иерархическим способом один за другим. Начало – базовый класс, конец – последний производный.

Деструкторы тоже могут быть вызваны при инициализации классом имеющегося объекта. Соответствующий процесс в данном случае осуществляется в обратном порядке по сравнению с конструкторами.

#include <iostream>
using namespace std;

class Device {
    public:
        // constructor
        Device() {
            cout << "Device constructor called" << endl;
        }
        // destructor
        ~Device() {
            cout << "Device destructor called" << endl;
        }
};

class Computer: public Device {
    public:
        Computer() {
            cout << "Computer constructor called" << endl;
        }
        ~Computer() {
            cout << "Computer destructor called" << endl;
        }
};

class Laptop: public Computer {
    public:
        Laptop() {
            cout << "Laptop constructor called" << endl;
        }
        ~Laptop() {
            cout << "Laptop destructor called" << endl;
        }
};

int main() {
    cout << "\tConstructors" << endl;
    Laptop Laptop_instance;
    cout << "\tDestructors" << endl;
    return 0;
}

Это – пример кода, который поможет понять принцип вызова упомянутых компонентов. В виде конструкторов выступают: Device-Computer-Laptop, деструкторов: laptop-Computer-Device.

Множественное наследование

Рассматривая иерархию классов с, стоит обратить внимание на множественное наследование. Оно происходит тогда, когда подкласс имеет два или более суперкласса (ключевое слово super class).

Наследование в программировании на примере C++ и Java

Выше – пример того, как выглядит в виде кодификации. Здесь класс Laptop будет одновременно выступать «наследником» Monitor и Computer.

Виртуальное наследование

В C++ есть new понятие – это «виртуальное наследование». Оно:

  1. Позволяет предотвратить появление множественных объектов базового класса в иерархии наследования.
  2. Конструктор базового класса Device – вызывается один раз.
  3. Обращение к turn_on без предопределения «родителя» в дочернем классе не вызовет ошибку при компиляции.
Наследование в программировании на примере C++ и Java

Выше – наглядный пример виртуального «варианта». В классах Computer и Monitor такой подход не разрешает ромбовидное наследование, если «дочь» Laptop будет получать в качестве «наследодателя» класс Device не виртуально (class Laptop: public Computer, public Monitor, public Device {};).

Иерархия в Java

Наследование в Java – это более понятный вариант. Освоить его принципы проще, чем в случае с C++. This method носит название «расширение класса». Ключевые понятия и определения тут точно такие же, как и в случае с Си-семейством. Поэтому слово public не должно вызывать проблемы.

Что унаследовано

При рассмотрении темы требуется запомнить:

  1. Когда подкласс расширяет суперкласс в Джаве, он будет наследовать защищенные и открытые (public) поля и методы. Они станут частью оной, словно подкласс сам их объявил.
  2. Защищенные и public поля можно вызывать и ссылаться на них, как на объявленные в их пределах методы.
  3. Поля и методы с модификаторами доступа по умолчанию (пакеты) бывают доступны для подклассов, если они расположены там же, где и superclass.
  4. На частные поля и методы (не public) суперкласса нельзя непосредственно ссылаться. Для этого используются методы, доступные для подкласса.

Как и в C++, конструкторы не подлежат рассматриваемой процедуре. Они должны вызывать конструктор для подкласса в superclass.

Единичный «подход»

Наследование в Java может быть единичным. Это – самый распространенный вариант. Он дает возможность получать свойства только от одного superclass.

Множественный вариант создает некоторые проблемы в ЯП. Пример – когда суперклассы имеют методы с одними и теми же именами и параметрами. Из Джавы такой вариант исключен. Поэтому достаточно понять права доступа и общие (public) принципы изучаемой операции.

Как объявить

Для того, чтобы воспользоваться приемом, когда уже ясно, что такое public, нужно использовать ключевик extends:

Наследование в программировании на примере C++ и Java

Здесь:

  1. Car будет выступать «расширителем» Vehicle.
  2. Соответствующее явление приводит к тому, что защищенное поле (не public) licensePlate из Vehicle перейдет в Car.
  3. После «получения свойств» от licensePlate, оно станет доступным внутри экземпляра Car.

Можно сослаться на Car. Делается это так:

Наследование в программировании на примере C++ и Java

Ссылка осуществляется внутри методы getLicensePlate. Обычно его помещают в класс Vehicle.

Приведение типов

Когда понятия public. Private, public static void и другие «базовые» для разработки поняты, можно переходить к более сложным моментам. В Джаве можно составлять на подкласс как на экземпляр одного из его суперклассов.

Наследование в программировании на примере C++ и Java

Сначала здесь будет создан экземпляр авто, затем он присваивается переменной типа Vehicle. Далее ссылка будет указывать на соответствующий экземпляр.

Приведение типа – это процесс ссылки на объект класса как тип, отличный от самого class a. Объект «перебрасывается» из одного вида в другой.

Upcasting и Downcasting

При разработке можно привести объект подкласса к одному из его superclass. К этому моменту пользователь должен уже хорошо разбираться в правах доступа, включая public.

Объект «наследника» может быть приведен к:

  • одному из его «родителей»;
  • из типа superclass к типу подкласса, если объект действительно выступает его экземпляром.
Наследование в программировании на примере C++ и Java

Приведенный пример downcasting будет действителен. А здесь можно посмотреть туториал по наследованию классов.

Как лучше понять процесс

Рассматривать соответствующую тему в «голой теории» — не лучшее решение. Понятия public и private можно изучить «только на бумаге». В случае с более сложными компонентами огромную роль играет практика. А еще – грамотно подобранный материал.

Здесь рассказывается о выбранном направлении в ООП в общих чертах. А тут – основы для C++.

Необходимые знания можно получить при помощи самообразования, а также обучаясь в техникуме или ВУЗе на направлении «программирование». Там рассказывают о наследовании в Java и других ЯП, разбирая процесс «с нуля».

Но лучшее решение – это дистанционные компьютерные курсы. Пользователи смогут заниматься тогда, когда им удобно. Программы рассчитаны как на новичков, так и на опытных разработчиков. Можно освоить одновременно несколько направлений в течении года. В конце выдается электронный сертификат, подтверждающий навыки и знания. С такими курсами элементы кода как static void main, superclass, public и другие будут понятны даже новичку.

Наследование в программировании на примере C++ и Java
Наследование в программировании на примере C++ и Java