Я бы сказал, что если у вас есть кодовая база, с которой вы хотите это сделать, то это не самая лучшая кодовая база. Обычно это признак того, что класс на одном уровне иерархии нуждается в определенной общедоступной подписи, в то время как другому классу, производному от этого класса, она не нужна.
Предстоящая парадигма кодирования называется «Композиция важнее наследования». Это напрямую связано с принципами объектно-ориентированной разработки (особенно с принципом единой ответственности и принципом открытости/закрытости).
К сожалению, так как многих из нас, разработчиков, учили объектной ориентации, у нас сформировалась привычка сразу думать о наследовании, а не о композиции. Мы склонны иметь более крупные классы, у которых много разных обязанностей, просто потому, что они могут содержаться в одном и том же объекте «Реального мира». Это может привести к иерархии классов глубиной более 5 уровней.
Неприятный побочный эффект, о котором разработчики обычно не думают при работе с наследованием, заключается в том, что наследование формирует одну из самых сильных форм зависимостей, которые вы когда-либо могли вводить в свой код. Ваш производный класс теперь сильно зависит от класса, от которого он был унаследован. Это может сделать ваш код более хрупким в долгосрочной перспективе и привести к мешающим проблемам, когда изменение определенного поведения в базовом классе неясным образом нарушает производные классы.
Один из способов разбить ваш код — использовать интерфейсы, упомянутые в другом ответе. В любом случае это разумно, поскольку вы хотите, чтобы внешние зависимости класса связывались с абстракциями, а не с конкретными/производными типами. Это позволяет вам изменить реализацию без изменения интерфейса, и все это без изменения строки кода в вашем зависимом классе.
Я бы предпочел не поддерживать систему с сотнями/тысячами/даже большим количеством классов, которые все маленькие и слабо связанные, чем иметь дело с системой, которая активно использует полиморфизм/наследование и имеет меньшее количество классов, которые более тесно связаны.
Возможно, лучшим ресурсом по объектно-ориентированной разработке является книга Роберта К. Мартина Гибкая разработка программного обеспечения, принципы, шаблоны и практика.
person
Jason Olson
schedule
20.09.2008