Абстрактный базовый класс и видимость конструктора - PullRequest
2 голосов
/ 30 июня 2010

Обычно я делаю базовый класс abstract для подачи сигнала это базовый класс - вы не можете создать для меня экземпляр! , даже если в нем нет абстрактных методов.

Кроме того, я всегда делаю конструктор базового класса защищенным, хотя в этом нет никакой реальной функциональной необходимости - я просто хочу еще раз подчеркнуть, что это базовый класс - вы не можете создать для меня экземпляр! 1008 * Я прыгаю через обручи при этом? Что ты делаешь?

Ответы [ 3 ]

9 голосов
/ 30 июня 2010

Это кажется разумным, да. Не будет никакой функциональной разницы между общедоступным или защищаемым конструктором, но его защита дает более четкое представление о предполагаемом использовании.

2 голосов
/ 30 июня 2010

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

Есть ли конкретный сценарий, который вы имеете в виду, где это может быть подходящий дизайн?

Редактировать
Единственный сценарий, который я обнаружил, когда абстрактный класс без абстрактных методов имеет смысл, - это когда абстрактный класс частично реализуется и взаимодействует. Производные классы необходимы для завершения реализации.

Ссылка на пример (редактирование: сайт пропал, Эта запись в блоге , похоже, является копией содержимого)

1 голос
/ 30 июня 2010

В абстрактном классе нет разницы между открытым или защищенным конструктором. На самом деле, я считаю, что компилятор должен выдавать предупреждение или ошибку при определении конструктора абстрактного класса как открытого. Жаль, что нет.

...