Перейти к содержимому

ООП основы

Введение

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

Инкапсуляция

Определение

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

Пример

#include <iostream>
class Circle {
private:
double radius;
public:
void setRadius(double r) {
if (r > 0) {
radius = r;
}
}
double getRadius() const {
return radius;
}
double getArea() const {
return 3.14159 * radius * radius;
}
};
int main() {
Circle c;
c.setRadius(5.0);
std::cout << "Radius: " << c.getRadius() << std::endl;
std::cout << "Area: " << c.getArea() << std::endl;
return 0;
}

Объяснение

В этом примере Circle инкапсулирует данные (радиус) и методы для их обработки. Доступ к радиусу возможен только через методы setRadius и getRadius, что обеспечивает контроль над значениями и скрытие реализации.

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

Определение

Наследование — это механизм, позволяющий создавать новый класс на основе существующего. Новый класс наследует свойства и методы базового класса.

Пример

#include <iostream>
class Animal {
public:
void eat() {
std::cout << "Eating..." << std::endl;
}
};
class Dog : public Animal {
public:
void bark() {
std::cout << "Barking..." << std::endl;
}
};
int main() {
Dog d;
d.eat();
d.bark();
return 0;
}

Объяснение

В этом примере класс Dog наследует свойства и методы класса Animal. Это позволяет объекту Dog использовать метод eat, определенный в базовом классе Animal.

Полиморфизм

Определение

Полиморфизм — это способность объектов различных классов быть обработанными единообразно. Он позволяет методам работать с объектами базового класса, которые могут быть заменены объектами производных классов.

Пример

#include <iostream>
class Animal {
public:
virtual void makeSound() const {
std::cout << "Some generic animal sound" << std::endl;
}
};
class Dog : public Animal {
public:
void makeSound() const override {
std::cout << "Bark" << std::endl;
}
};
class Cat : public Animal {
public:
void makeSound() const override {
std::cout << "Meow" << std::endl;
}
};
void playSound(const Animal& animal) {
animal.makeSound();
}
int main() {
Dog dog;
Cat cat;
playSound(dog);
playSound(cat);
return 0;
}

Объяснение

В этом примере метод playSound принимает ссылку на базовый класс Animal. Благодаря полиморфизму, правильная версия метода makeSound вызывается для объектов Dog и Cat.

Абстракция

Определение

Абстракция — это процесс выделения значимых характеристик объекта и игнорирования незначительных деталей. Она позволяет создавать модели реальных объектов с помощью классов и интерфейсов.

Пример

#include <iostream>
#include <string>
class Shape {
public:
virtual double getArea() const = 0; // чисто виртуальный метод
virtual std::string getName() const = 0; // чисто виртуальный метод
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double getArea() const override {
return 3.14159 * radius * radius;
}
std::string getName() const override {
return "Circle";
}
};
class Rectangle : public Shape {
private:
double width, height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double getArea() const override {
return width * height;
}
std::string getName() const override {
return "Rectangle";
}
};
void printShapeInfo(const Shape& shape) {
std::cout << "Shape: " << shape.getName() << ", Area: " << shape.getArea() << std::endl;
}
int main() {
Circle circle(5.0);
Rectangle rectangle(4.0, 6.0);
printShapeInfo(circle);
printShapeInfo(rectangle);
return 0;
}

Объяснение

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

Резюме

  • Инкапсуляция объединяет данные и методы в один объект, скрывая детали реализации.
  • Наследование позволяет создавать новый класс на основе существующего, наследуя его свойства и методы.
  • Полиморфизм обеспечивает единообразную работу с объектами базового класса и их производными.
  • Абстракция выделяет значимые характеристики объекта, позволяя создавать модели реальных объектов.