Мне задали вопрос, я хотел, чтобы мой ответ рассматривался здесь.
Q: В каком сценарии более целесообразно расширять абстрактный класс, а не реализовывать интерфейс (ы)?
A: Если мы используем шаблон шаблона шаблона.
Правильно ли я?
Прошу прощения, если я не смог четко сформулировать вопрос.
Я знаю основную разницу между абстрактным классом и интерфейсом.
1) используйте абстрактный класс, когда требование таково, что нам нужно реализовать ту же функциональность в каждом подклассе для конкретной операции (реализовать метод) и различные функции для некоторых других операций (только сигнатуры методов)
2) используйте интерфейс, если вам нужно поставить подпись одинаковой (и другую реализацию), чтобы вы могли выполнить реализацию интерфейса
3) мы можем расширить max одного абстрактного класса, но можем реализовать более одного интерфейса
Повторяя вопрос: Есть ли какие-либо другие сценарии, помимо упомянутых выше, где конкретно нам требуется использовать абстрактный класс (один из них - шаблон шаблона для шаблонов, концептуально основанный только на этом)?
Интерфейс против абстрактного класса
Выбор между этими двумя действительно зависит от того, что вы хотите сделать, но, к счастью для нас, Эрих Гамма может немного помочь нам.
Как всегда есть компромисс, интерфейс дает вам свободу относительно базового класса, абстрактный класс дает вам свободу добавлять новые методы позже. - Эрих Гамма
Вы не можете перейти и изменить интерфейс, не изменяя при этом много других вещей, поэтому единственный способ избежать этого - создать совершенно новый интерфейс, который может не всегда хорошо.
Abstract classes
следует в первую очередь использовать для объектов, которые тесно связаны. Interfaces
лучше обеспечивают общую функциональность для несвязанных классов.