Показать сообщение отдельно
Старый 13.03.2009, 00:30
Stargazer вне форума Посмотреть профиль Отправить личное сообщение для Stargazer Найти все сообщения от Stargazer
  № 46  
Ответить с цитированием
Stargazer

Регистрация: Nov 2008
Сообщений: 528
Цитата:
Сообщение от 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. добавил в пример множественное наследование.


Последний раз редактировалось Stargazer; 13.03.2009 в 00:39.