Найти тему
айтишник наоборот

А вы знаете столпы ООП?

Говорим о второй важной вещи для приёма на работу в IT разработку. Весь чек лист можно найти у меня на канале. Пытаюсь объяснить просто и на примерах. Начнём.

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

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

Смотрим на пример кода:

#include <iostream>

using namespace std;

// Базовый класс животное

class Animal {

protected:

   // Защищенные данные: имя, возраст

   string name;

   int age;

public:

   // Открытые методы

   Animal(string Name, int Age) {

       name = Name;

       age = Age;

   }

   void GetInfo() {

       cout << "Name: " << name << endl;

       cout << "Age: " << age << endl;

   }

};

// Класс собака, наследующийся от класса животное

class Dog : public Animal {

private:

   // Дополнительные данные только для собаки

   string breed;

public:

   // Конструктор класса Dog

   Dog(string Name, int Age, string Breed) : Animal(Name, Age) {

       breed = Breed;

   }

   void GetInfo() {

       // Вызываем метод GetInfo базового класса, чтобы вывести имя и возраст

       Animal::GetInfo();

       cout << "Breed: " << breed << endl;

   }

};

int main() {

   Dog myDog("Charlie", 3, "Labrador");

   myDog.GetInfo();

   return 0;

}

В данном примере класс собака наследуется от базового класса животное и добавляет собственное поле "порода". В методе GetInfo мы также вызываем метод GetInfo базового класса, чтобы вывести имя и возраст собаки.

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

#include <iostream>

using namespace std;

/* Абстрактный класс транспортного средства */

class Transport {

public:

   virtual void move() = 0; // Виртуальный метод движения

};

/* Класс автомобиля, наследующийся от класса транспортного средства */

class Car : public Transport {

public:

   void move() override { // Переопределение виртуального метода движения

       cout << "The Car is moving." << endl;

   }

};

/* Класс велосипеда, наследующийся от класса транспортного средства */

class Bicycle : public Transport {

public:

   void move() override { // Переопределение виртуального метода движения

       cout << "The Bicycle is moving." << endl;

   }

};

int main() {

   Transport* obj; // Указатель на объект класса транспорта

   Car car; // Создание объекта класса автомобиля

   Bicycle bicycle; // Создание объекта класса велосипеда

   obj = &car; // Присвоение указателю адреса объекта класса автомобиля

   obj->move(); // Вызов виртуальной функции движения для автомобиля

   obj = &bicycle; // Присвоение указателю адреса объекта класса велосипеда

   obj->move(); // Вызов виртуальной функции движения для велосипеда

   return 0;

}

/* Результат выполнения программы:

The Car is moving.

The Bicycle is moving. */

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

Псмотрим на примере кода, комментарии ниже.

#include <iostream>

using namespace std;

class Employee {

   private:

       float salary; // переменная зарплата

       int id; // переменная id

   public:

       // методы доступа к переменной зарплата

       void setSalary(float s) {

           salary = s;

       }

       float getSalary() {

           return salary;

       }

       // методы доступа к переменной id

       void setId(int i) {

           id = i;

       }

       int getId() {

           return id;

       }

};

int main() {

   Employee emp;

   emp.setSalary(5000.0);

   emp.setId(1);

   cout << "Employee ID: " << emp.getId() << endl;

   cout << "Employee Salary: $" << emp.getSalary() << endl;

   return 0;

}

// Класс Employee содержит две частные переменные: зарплату и id сотрудника.

// Методы setSalary и getSalary обеспечивают доступ к переменной зарплата.

// Методы setId и getId обеспечивают доступ к переменной id.

// В функции main создается объект emp класса Employee, устанавливаются значения его зарплаты и id, которые затем отображаются на экране.

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

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

он знает столпы ООП, а ты?
он знает столпы ООП, а ты?