Абстрактный базовый класс без полиморфизма - PullRequest
1 голос
/ 06 июня 2011

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

Ответы [ 6 ]

4 голосов
/ 06 июня 2011

Возможно, вы захотите поменять реализацию на что-то вроде модульного тестирования

3 голосов
/ 06 июня 2011

Одна из причин, почему вы бы это сделали, - это тестируемость. Гораздо проще тестировать зависимые объекты, когда их зависимости определены как интерфейсы. Это дает легкую способность издеваться или заглушки.

2 голосов
/ 06 июня 2011

Чтобы нарушить принцип повторного использования абстракции .

Короче, не делайте этого.

Те, кто говорят "для тестирования", упускают из виду, что вы можете простозамените

Base < - > Derived
Base < - > DerivedForMockingAndTesting

на

Derived < - > DerivedForMockingAndTesting    

То есть пусть ваша существующая реализация Derived будет использоваться в качестве "абстракции", которая будет смоделирована и протестирована в модульном тестировании.

1 голос
/ 06 июня 2011

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

1 голос
/ 06 июня 2011

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

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

1 голос
/ 06 июня 2011

Если вы можете быть на 100% уверены, что всегда будет только один и ровно один производный класс?Не много причин.НО: На самом деле вы вряд ли будете на 100% уверены в чем-либо, и уж точно не в будущем своего кода.

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