Форум: "Потрепаться";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
ВнизВот спорю с коллегой на работе, подскажите есть ли множественное Найти похожие ветки
← →
Rule © (2004-08-10 09:44) [0]наследие классов в делфийском обджект паскале, если нет то как обходится эта проблемма, а если да то как реализовать это чудо ?
← →
Думкин © (2004-08-10 09:58) [1]А что спорить? Нету. А зачем?
← →
Ega23 © (2004-08-10 10:00) [2]Теоретически нет, практически можно через интерфейсы изгольнуться, только это уже не совсем наследование.
← →
Skyle © (2004-08-10 10:01) [3]Удалено модератором
Примечание: Личная переписка
← →
VMcL © (2004-08-10 10:03) [4]>>Rule © (10.08.04 09:44)
Для классов, реализующих интерфейсы, есть: можно в одном классе реализовать несколько интерфейсов. Для обычных классов - нет.
P. S. Ну и как правильно отметил [1]: а зачем? :)
← →
Юрий Зотов © (2004-08-10 10:03) [5]1. Сабж - нет.
2. Как обходится - по-разному, от задачи зависит.
3. Как реализовать - написать свой компилятор.
← →
Anatoly Podgoretsky © (2004-08-10 10:03) [6]В большинстве языков этого нет, вот и в СиДиез убрали.
← →
Игорь Шевченко © (2004-08-10 10:06) [7]Думкин © (10.08.04 09:58) [1]
> А зачем?
Затем же, зачем в С++, не так ли ?
← →
Думкин © (2004-08-10 10:06) [8]Удалено модератором
Примечание: Личная переписка
← →
Думкин © (2004-08-10 10:07) [9]> [7] Игорь Шевченко © (10.08.04 10:06)
Я не спорю, а спрашиваю. Мне вот напрямую пока никак. Обходился, хотя были иногда желания. :)
← →
Игорь Шевченко © (2004-08-10 10:09) [10]Думкин © (10.08.04 10:07) [9]
Мне, например, из-за его отсутствия приходится писать лишний код. Иногда напрягает.
← →
Думкин © (2004-08-10 10:10) [11]> [10] Игорь Шевченко © (10.08.04 10:09)
Да, для обхода приходится попотеть. Видимо, есть зачем. :)
Я потел.
← →
han_malign © (2004-08-10 10:12) [12]Множественное наследование - это всего лишь агрегация, а делать ее явно - средствами любого объектного языка, или неявно - магией С++, личное дело каждого...
← →
Гаврила © (2004-08-10 10:13) [13]
> Игорь Шевченко © (10.08.04 10:09) [10]
а зачем лишний код ?
через implements вроде как лишенго кода писать и не надо
← →
Anatoly Podgoretsky © (2004-08-10 10:14) [14]han_malign © (10.08.04 10:12) [12]
Аггрегация и наследования разные вещи, аггрегация поддержана полностью.
← →
Игорь Шевченко © (2004-08-10 10:20) [15]
> через implements вроде как лишенго кода писать и не надо
? это как, не соображу с утра :)
← →
Rule © (2004-08-10 10:23) [16]Во спасибо просветили, а почему Борланд не реализовала эту функцию в своем компиляторе,
а интересно в Билдере тогда получается что есть, почему тогад в Делфи не реализовали
может им письмо написать по этому поводу
← →
Думкин © (2004-08-10 10:25) [17]> [16] Rule © (10.08.04 10:23)
А также по шаблонам, двухпроходности и т.д. и т.п?
← →
REA © (2004-08-10 10:26) [18]В ООН лучше написать. И лично Нельсону Манделе.
← →
Rule © (2004-08-10 10:29) [19]REA © (10.08.04 10:26) [18]
Да зачем, последователям Бен-Ладена написать типа так и так америкосы опять обижают нормальных людей, правоверных мусульман, нарушают принципы корана в программировании, что делать?
и я думаю пробемма решится :)
← →
Romkin © (2004-08-10 10:31) [20]Игорь Шевченко © (10.08.04 10:20) [15] implements - это для интерфейсов :))
Rule © (10.08.04 10:23) [16] Нет. И не надо :)
← →
Игорь Шевченко © (2004-08-10 10:37) [21]Romkin © (10.08.04 10:31) [20]
> implements - это для интерфейсов :))
На таком уровне я знаю :)
Но не соображу, как можно указанием implements избавиться от написания кода для создания подобия множественного наследования. Где будет реализация методов интерфейса ?
← →
Skyle © (2004-08-10 10:47) [22]
> Anatoly Podgoretsky © (10.08.04 10:14) [14]
> Аггрегация и наследования разные вещи, аггрегация поддержана
> полностью.
А что значит "аггрегация"?
Это что-то типа этого?TSomeClass = class(...)
FSomeField : TSomeAnotherClass;
То есть, объектные поля в классах?
P.S. Подозреваю, что терминология страдает, так что если я неправ, скажите хоть, как это правильно называется...;-)
← →
Иван Шихалев © (2004-08-10 10:54) [23]
> Но не соображу, как можно указанием implements избавиться
> от написания кода для создания подобия множественного наследования.
> Где будет реализация методов интерфейса ?
type
I1 = interface
......
end;
I2 = interface
......
end;
C1 = class(TInterfacedObject,I1)
... реализуем I1 ...
end;
C2 = class(TInterfacedObject,I2)
... реализуем I2 ...
end;
CM = class(C1,I2)
.....
property P2 : C2 implements I2
.....
end;
</cide>
CM унаследовал реализацию I1 от C1 и делегировал реализацию I2 к C2. Сам он уже не должен что-либо реализовывать. Правда в конструкторе, наверное, придется создавать экземпляр C2 в какое-то свое поле...
← →
Иван Шихалев © (2004-08-10 10:55) [24]Назвается - реализация делегированием :)
← →
Гаврила © (2004-08-10 10:57) [25]
> Игорь Шевченко © (10.08.04 10:37) [21]
class1 реализует interface1
class2 реализует interface1 и interface2
экземпляр class1 является полем class2
class2 реализует interface2 сам, а interface1 перенаправлением вызовов на class1 с помощью implements, то есть без кода реализации
← →
Гаврила © (2004-08-10 11:00) [26]А вообще по поводу множественного наследования есть хороший пример из жизни.
Если потомок наследует все свойства обоих родителей, то у ребенка (человека) должны быть и мужские и женские половые признаки :-))
← →
DiamondShark © (2004-08-10 11:07) [27]
> Игорь Шевченко © (10.08.04 10:37) [21]
> Но не соображу, как можно указанием implements избавиться
> от написания кода для создания подобия множественного наследования.
А что, множественное наследование уже избавляет от написания кода?
> Где будет реализация методов интерфейса ?
В агрегируемом объекте.
Вообще-то, реализация интерфейсов -- более прозрачная и логичная схема, чем множественное наследование.
Кстати, можно пример задачи, где без множественного наследования плохо живётся?
← →
Romkin © (2004-08-10 11:25) [28]Да, интерфейсы - второй этап ООП, устраняются многие неясности.
А без множественного наследования нормально живется :))
Кстати, в D6 TComponent уже реализует интерфейс. Только недавно узнал :(
← →
Гаврила © (2004-08-10 11:30) [29]
> Кстати, можно пример задачи, где без множественного наследования
> плохо живётся?
Некоторые компоненты (потомки TControl) также имеют машинку UNDO. Для "двух стрелочек" в панели кнопок. По обработке метода Undo так же существует иерархия классов
← →
Игорь Шевченко © (2004-08-10 11:35) [30]Romkin © (10.08.04 11:25) [28]
> Кстати, в D6 TComponent уже реализует интерфейс. Только
> недавно узнал :(
В D5 тоже.
DiamondShark © (10.08.04 11:07) [27]
> А что, множественное наследование уже избавляет от написания
> кода?
Я не писал - избавляет.
> Вообще-то, реализация интерфейсов -- более прозрачная и
> логичная схема, чем множественное наследование.
Множественное наследование не менее прозрачно и логично.
> Кстати, можно пример задачи, где без множественного наследования
> плохо живётся?
Скажем, иерархия классов, умеющая сохраняться и восстанавливаться из потока. (Для примера - реализация Turbo Vision в Borland C++)
← →
DiamondShark © (2004-08-10 11:48) [31]
> Скажем, иерархия классов, умеющая сохраняться и восстанавливаться
> из потока. (Для примера - реализация Turbo Vision в Borland
> C++)
Мимо! Это как раз и была эмуляция интерфейсов.
Собственно, все примеры с МН, которые я видел, представляют собой именно такую эмуляцию.
Так что фтопку.
← →
Romkin © (2004-08-10 12:01) [32]Игорь Шевченко © (10.08.04 11:35) [30] в D5 это не так явно :))
Впрочем, наворотили то еще...
И вообще, множественное наследование классов устарело :)
← →
Rule © (2004-08-10 12:06) [33]Romkin © (10.08.04 12:01) [32]
И вообще, множественное наследование классов устарело :)
Ха, вот этим и буду аргументировать свои доводы по поводу того что оно не надо и можно без этого обойтись
← →
Игорь Шевченко © (2004-08-10 12:07) [34]Romkin © (10.08.04 12:01) [32]
> И вообще, множественное наследование классов устарело :)
Мода прошла ? :)
Я не совсем понимаю термина "устарел" применительно к наследованию.
← →
Гаврила © (2004-08-10 12:15) [35]В принципе, может быть и устарело...
Как в свое время устарело линейное программирование, когда на смену пришло ООП
← →
имя (2004-08-10 12:19) [36]Удалено модератором
← →
Игорь Шевченко © (2004-08-10 12:21) [37]Гаврила © (10.08.04 10:57) [25]
> class1 реализует interface1
> class2 реализует interface1 и interface2
>
> экземпляр class1 является полем class2
> class2 реализует interface2 сам, а interface1 перенаправлением
> вызовов на class1 с помощью implements, то есть без кода
> реализации
Но при этом придется создавать экземпляр class1, передавать ему ссылку на экземпляр class2 (чтобы методы, реализованные в class1 знали о данных class2), правильно ?
← →
Romkin © (2004-08-10 12:24) [38]Игорь Шевченко © (10.08.04 12:07) [34] Применительно к множественному наследованию классов ;)
Просто наследование никто не отменяет. А устарело потому, что на смену ему пришло наследование интерфейсов.
Простой пример: у предка есть виртуальный метод, наследник его перекрывает, но не вызывает в нем inherited, собственно метод предка. Допустимо ли это технологией? Конечно. Но ведь потомок не знает, что делает метод предка, который он не вызвал. А он может делать что-то, затрагивающее функциональность предка, да хоть количество его вызовов подсчитывать :) Вот и получается, что программист, написав потомок, вторгся в логику работы предка, и изменил ее!
Понятно, есть соглашения, что надо, что не надо... Но это - соглашения. И как правило, приходится смотреть код предка, когда пишешь потомка.
А при использовании интерфейсов таких тонкостей просто нет. И более того, с интерфейсами для того, чтобы твой класс воспринимался как предок, ты не обязан порождать свой класс от предка, можно просто реализовать его интерфейс. Так, как хочется.
А если еще учесть, что при использовании интерфейсов есть возможность агрегировать в себя (читай - унаследовать) всю функциональность класса, написанного на другом языке, то становиться понятным, почему я говорю, что множественное наследование классов устарело :))
← →
Romkin © (2004-08-10 12:30) [39]Игорь Шевченко © (10.08.04 12:21) [37] Немного не так. Создавать придется. Но перенаправлять ничего не надо, все, что нужно агрегату, это IUnknown class2. А это предусмотрено, см CoCreateInstance, параметр pUnkOuter :))
То есть, агрегирование - это несколько строк кода, объявить и создать, сообщив ему, что он - агрегирован. Указывать надо по той причине, что при агрегации будет использоваться счетчик ссылок контейнера, а не агрегируемого объекта. Остальное - полностью без изменений.
← →
Гаврила © (2004-08-10 12:31) [40]
> Игорь Шевченко © (10.08.04 12:21) [37]
Создать class1 надо конечно, поскольку он является полем class2, то и создать его логично в конструкторе class2. Вот и весь код. НУ а передавать ли ему ссылку на class1 - от задачи зависит :-)
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.033 c