Цитата:
Сообщение от iNils
Ключевое в наследовании - это наследование. Когда вы реализовываете функционал описанный в интерфейсе, вы описываете его полностью с нуля. И когда у вас так "унаследовано" 200 классов и вы расширите этот интерфейс, вы будете править 200 классов.
|
Во-первых - а вот и нет.
Как один из вариантов (в делфи, по крайней мере) - можно использовать ключевое слово implements, которое позволяет назначить какое-нибудь поле как класс, отвечающий за реализацию интерфейса (удобно, когда один класс реализует сразу несколько интерфейсов). Таким образом я его буду описывать не с нуля, а на основе класса. Если потом вы расширите этот интерфейс - вам нужно переписать только один этот класс. Другой вариант (и часто более эффективный, в итоге) - просто создать базовый класс, который реализует интерфейс и от него создавать все другие классы.
Пример (приведены только укороченные объявления):

Код:
Type
TMyFirstClassA= class; // базовый класс
TMySecondClassA= class(TMyFirstClassA); // при помощи скобок в делфи указывается базовый класс по отношению к данному
TMyFirstClassB= class; // другой класс из другой иерархии
TMySecondClassB= class(TMyFirstClassB); // его наследник, соответственно
//Теперь предположим, что я решил, объединить их чем-то общим.
//Для этого я ввожу в цепочку классы, реализующие интерфейсы
IClassA= interface;
IClassB= interface;
TInterfacedClassA= class(TMySecondClassA, IClassA);
TInterfacedClassB= class(TMySecondClassB, IClassB);
TInterfacedClassAB= class(IClassA, IClassB);
//Ну и теперь я могу в своё удовольствие расширять функциональность, будучи уверенным, что мне не придётся "по 200 раз переписывать потомков"
TThirdClassA= class(TInterfacedClassA);
TThirdClassB= class(TInterfacedClassB);
TThirdClassAB= class(TInterfacedClassAB);
Во-вторых - если вы каким-либо существенным образом измените базовый клас от которого самым настоящим убразом
унаследованы 200 других классов - вам уже не нужно будет переписывать 200 потомков?
Поэтому давайте вы не будете спешить с выводами, насчёт того, как я себя самообманываю, насколько эффективным будет мой код на интерфейсах и сколько у меня будет лишней работы.
P.S. добавил в пример множественное наследование.