Задать вопрос
@romicohen
Системный Архитектор

Почему бы вместо абстрактного класса не делать обычный, но с пустыми методами?

сабж :)

Никогда не использовал эту фичу - абстрактный класс - потому что не понимаю: зачем она вообще нужна?

Я ведь могу просто не определять тело метода в базовом обычном классе, да и всё.

Или я что-то упустил в рассуждениях?
  • Вопрос задан
  • 500 просмотров
Подписаться 3 Простой 2 комментария
Решения вопроса 2
samodum
@samodum
Какой вопрос - такой и ответ
Абстрактный класс нужен для того, чтобы не было возможности создавать его экземпляры, а только его классов-наследников.
Простой пример. Пусть у нас будет абстрактный класс Фигура с методом Нарисовать; и есть его классы-наследники Круг и Квадрат.
Так вот. Экземпляры классов Круг и Квадрат мы имеем право создавать, а вот экземпляр Фигуры создавать не имеем права, т.к. это не имеет физического смысла. И уж тем более мы никак не можем реализовать метод Нарисовать у Фигуры. Поэтому и сделан такой запрет на абстрактные классы.
Это необходимо, чтобы код был надёжным и защищённым от кривых рук других программистов
Ответ написан
gbg
@gbg
Любые ответы на любые вопросы
То что для наследования от абстрактного класса нужно обязательно написать реализацию всех виртуальных методов, отсутствие реализации метода будет приводить к ошибкам.

В вашем же случае, пустой метод будет делать ничего и в программе появится ошибка, которую можно было бы предотвратить синтаксически.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@AlexSku
не буду отвечать из-за модератора
Если есть несколько братьев, то у них должен быть родитель.
Родитель (как интерфейс) объявляет кучу методов без реализации, у потомков реализация уже специализирована (поэтому в родителе описывать и нечего).

Я ведь могу просто не определять тело метода в базовом обычном классе, да и всё.

Действительно, так делают: одна часть методов определена у родителя, но не все.
А вот если ни один метод не определять, то встаёт вопрос - нужен ли такой экземпляр без методов? Вот абстракция и решение: нельзя сделать экземпляр.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Не в курсе как-там в PHP это работает, но в принципе, абстрактные классы вынуждают наследников переопределять абстрактные методы. Использовать не переопределенные абстрактные методы невозможно - будет ошибка.
В случае же обычного класса и пустого метода - вы запросто можете использовать не переопределенные в наследнике методы. Никакого эффекта от такого использования не будет (метод же ничего не делает), но и ошибки не будет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы