Зачем нужны абстрактные классы и методы — обоснование до синтаксиса
less_39___abstract_class__custom_Exceptions/theory_01__abstract_classes_and_methods__rationale.md
Чисто концептуальный файл без кода классов: объясняет ЗАЧЕМ нужны абстрактные классы, прежде чем показывать КАК их писать (реализация — в следующем файле). Перечисляет четыре причины: единый интерфейс для наследников (все Dog/Cat/Bird обязаны иметь make_sound()), гибкость и расширяемость (новый наследник автоматически работает со старым кодом), защита от создания «недопустимых» объектов с нереализованными методами, и возможность сочетать в одном классе готовый код и обязательные для реализации методы.
- Причина 1: единый интерфейс — animals = [Dog(), Cat()]; animal.make_sound()
- Причина 2: гибкость — новый наследник (Bird) работает с существующим кодом без изменений
- Причина 3: защита от ошибок — нельзя случайно создать объект с недоделанными методами
- Причина 4: комбинация готового кода и обязательного интерфейса в одном классе
- Итоговый список из 4 пунктов
Показать начало файла (53 строк всего)
## Зачем нужны абстрактные классы и методы?
### 1. Обеспечивают единый интерфейс
Абстрактный класс задаёт «контракт» для всех наследников.
* Пример: если у нас есть разные виды животных (`Dog`, `Cat`, `Bird`), у всех есть метод `make_sound()`.
* Абстрактный класс `Animal` гарантирует, что любой новый класс-наследник тоже будет иметь метод `make_sound()`.
**Плюс:** мы можем обращаться к объектам через общий тип:
```python
animals = [Dog(), Cat()]
for animal in animals:
animal.make_sound() # Не важно, кто это — все обязаны иметь make_sound
```
---
### 2. Позволяют писать более гибкий и расширяемый код
* Мы создаём общую структуру один раз (абстрактный класс).
* Любой новый тип наследника может расширять или менять поведение, не ломая остальной код.
**Пример:** добавили новый класс `Bird`, он автоматически работает с кодом, который работает с `Animal`.
---
### 3. Защищают от неправильного использования
* Нельзя случайно создать объект абстрактного класса, где некоторые методы ещё не реализованы.
* Это предотвращает ошибки ещё на этапе написания кода.
---
### 4. Позволяют комбинировать реализацию и интерфейс
* Абстрактный класс может содержать
* и **частично готовый код** (обычные методы)
* и **обязательные методы для реализации** (абстрактные).
* Это экономит повторное написание кода и делает проект более поддерживаемым.
---
### Резюме
**Абстрактные классы нужны для того, чтобы:**
1. Обеспечить единый интерфейс для всех наследников.
2. Сделать код расширяемым и гибким.
3. Предотвратить создание «недопустимых» объектов.
4. Частично реализовать общую функциональность.