← Назад к вопросам

Какие знаешь принципы ООП?

1.6 Junior🔥 271 комментариев
#ООП и проектирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Принципы объектно-ориентированного программирования (ООП)

ОООП — парадигма программирования, основанная на концепции объектов, которые содержат данные (состояние) и методы (поведение). В C++ это реализуется через классы, структуры и наследование.

1. Инкапсуляция (Encapsulation)

Инкапсуляция — принцип скрытия внутренних деталей реализации и предоставления контролируемого интерфейса для взаимодействия. Это достигается через модификаторы доступа: private, protected, public.

class BankAccount {
private:
    double balance;  // скрыто от внешнего доступа
    
public:
    void deposit(double amount) {
        if (amount > 0) balance += amount;
    }
    
    double getBalance() const { return balance; }
};

Преимущества: защита инвариантов объекта, возможность изменить внутреннюю реализацию без влияния на код клиентов.

2. Наследование (Inheritance)

Наследование — механизм создания новых классов на основе существующих, позволяющий повторно использовать и расширять функциональность.

class Animal {
public:
    virtual void speak() const {
        std::cout << "Some sound" << std::endl;
    }
    virtual ~Animal() = default;
};

class Dog : public Animal {
public:
    void speak() const override {
        std::cout << "Woof!" << std::endl;
    }
};

Виды наследования: публичное (public), защищённое (protected), приватное (private). Рекомендуется использовать публичное наследование для отношения "является" (is-a).

3. Полиморфизм (Polymorphism)

Полиморфизм — способность объектов разных типов реагировать на одно и то же сообщение по-разному. В C++ реализуется через виртуальные функции.

void animalSound(const Animal& animal) {
    animal.speak();  // вызовет нужный метод в зависимости от типа
}

Dog dog;
Cat cat;
animalSound(dog);   // выведет "Woof!"
animalSound(cat);   // выведет "Meow!"

Статический полиморфизм (compile-time) реализуется через шаблоны и перегрузку операторов:

template<typename T>
void process(T value) { /* ... */ }

4. Абстракция (Abstraction)

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

class DatabaseConnection {
public:
    virtual bool connect(const std::string& url) = 0;
    virtual bool execute(const std::string& query) = 0;
    virtual ~DatabaseConnection() = default;
private:
    // детали реализации скрыты
};

Абстрактные классы (с pure virtual функциями) определяют контракт, который должны выполнять производные классы.

5. Композиция (Composition)

Композиция — отношение "имеет" (has-a), когда объект содержит другие объекты. Часто предпочтительнее наследования.

class Engine {
public:
    void start() { /* ... */ }
};

class Car {
private:
    Engine engine;  // композиция
    
public:
    void drive() {
        engine.start();
    }
};

Композиция дает большую гибкость и избегает проблем с множественным наследованием.

Золотые правила ООП в C++

  • SOLID принципы: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion
  • Предпочитай композицию наследованию — более гибкий и надежный подход
  • Используй virtual функции для полиморфизма
  • Избегай глубокой иерархии — 2-3 уровня часто достаточно
  • Помни о виртуальном деструкторе в базовых классах

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

Какие знаешь принципы ООП? | PrepBro