Говорим о второй важной вещи для приёма на работу в 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, которые затем отображаются на экране.
В заключение следует отметить, что объектно-ориентированное программирование - это полезный подход к программированию, который использует наследование, полиморфизм и инкапсуляцию для повышения эффективности кода и облегчения работы с ним. Понимание этих особенностей необходимо для любого начинающего студента ИТ-специальности, желающего стать квалифицированным программистом.
Спасибо за внимание, подписывайтесь на канал, будет интересно.