Когда использовать абстрактный класс без интерфейса? - PullRequest
2 голосов
/ 16 февраля 2010

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

Сначала я пытался различить, когда использовать интерфейс, а когда использовать абстрактный класс, рассматривая возможность «против», но я все равно в конечном итоге буду страдать от того, что не сделал интерфейс для начала.

Итак, вопрос в том, когда хорошая идея иметь только абстрактный класс и вообще никакого интерфейса?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2010

Если вы хотите "дать" некоторую функциональность базового класса производным классам, но когда этой функциональности недостаточно для создания экземпляра пригодного к использованию класса, тогда переходите к абстрактным классам.

Если вы хотите, чтобы некоторые классы полностью реализовали набор методов (публичный контракт), тогда удобно определить такой контракт с интерфейсами и применить их к классам, заставив их наследовать этот интерфейс.

Короче говоря:

С абстрактными классами вы предоставляете некоторые базовые функциональные возможности производным классам. Никаких дальнейших действий не требуется, если у абстрактного класса нет заглушек (которые должны быть реализованы там внизу).

Для интерфейсов вам требуются производные классы для реализации набора функций, и вы не передаете никакой реализации.

Таким образом, вопрос в том, когда хорошая идея иметь только абстрактный класс и вообще никакого интерфейса?

  • Если вы не хотите применять какой-либо публичный контракт (набор методов / свойств, определенных интерфейсом).

  • Также, когда вы не планируете использовать определенные методы кодирования, такие как приведение объекта к типу интерфейса (полиморфизм во время выполнения) или ограничение допустимого ввода (некоторые аргументы метода будут принимать только объекты типов, которые реализуют определенные интерфейсы).

0 голосов
/ 16 февраля 2010

Ну, основной случай, когда полезно иметь только абстрактный класс без какого-либо интерфейса, это пометить определенный тип. Полезно иметь возможность проверить, является ли объект чем-то. Эти интерфейсы «помечают» объект определенного типа. В зависимости от языка, который вы используете, применяются разные шаблоны дизайна ...

Такого рода абстрактные классы существуют в Java. Вы также можете использовать их в C ++ с RTTI.

my2c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...