---
sidebar_position: 8
---

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

Объектно-ориентированное программирование (ООП) — это парадигма, основанная на концепции объектов, которые объединяют данные и методы для работы с ними. Основные принципы ООП:

## 1. Инкапсуляция 
**Смысл:** Объединение данных (свойств) и методов внутри объекта с контролем доступа. \
**Зачем?** Защита данных, предотвращение прямого изменения извне.
```ts
class User {
    private password: string;

    constructor(public name: string, password: string) {
        this.password = password;
    }

    checkPassword(input: string): boolean {
        return this.password === input;
    }
}

const user = new User("Alice", "secret123");
console.log(user.checkPassword("wrong")); // false
console.log(user.checkPassword("secret123")); // true
```
📌 `private` скрывает `password`, и его нельзя изменить напрямую.

## 2. Наследование
**Смысл:** Позволяет создавать новые классы на основе существующих. \
**Зачем?** Повторное использование кода и расширение функциональности.
```ts
class Animal {
    constructor(public name: string) {}
    makeSound() {
        console.log("Some sound...");
    }
}

class Dog extends Animal {
    makeSound() {
        console.log("Woof!");
    }
}

const dog = new Dog("Buddy");
dog.makeSound(); // Woof!
```

📌 `Dog` наследует `Animal`, но переопределяет метод `makeSound()`.

## 3. Полиморфизм
**Смысл:** Разные объекты могут иметь **одинаковый интерфейс**, но разное поведение. \
**Зачем?** Универсальный код, который работает с разными типами объектов.
```ts
class Animal {
    constructor(public name: string) {}
    makeSound() {
        console.log("Some sound...");
    }
}

class Dog extends Animal {
    makeSound() {
        console.log("Woof!");
    }
}

const dog = new Dog("Buddy");
dog.makeSound(); // Woof!
```
📌 `Penguin` изменяет логику `fly()`, но всё ещё является `Bird`.

## 4. Абстракция
**Смысл:** Выделение **важных деталей**, скрытие реализации. \
**Зачем?** Упрощение работы с кодом, фокус только на важном.
```ts
abstract class Transport {
    constructor(public speed: number) {}

    abstract move(): void;
}

class Car extends Transport {
    move() {
        console.log(`Driving at ${this.speed} km/h`);
    }
}

const car = new Car(100);
car.move(); // Driving at 100 km/h
```
📌 `abstract` запрещает создавать `Transport`, но заставляет `Car` реализовать `move()`.

## Итог
- ✅ **Инкапсуляция** — скрываем детали и контролируем доступ.
- ✅ **Наследование** — создаём новые классы на основе существующих.
- ✅ **Полиморфизм** — разные классы могут вести себя по-разному.
- ✅ **Абстракция** — скрываем сложные детали, оставляем главное.

🚀 ООП помогает писать **гибкий, переиспользуемый и читаемый код!**


🚀 **_Источник: ChatGPT_**