Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.29;
Скачать: CL | DM;

Вниз

Вот спорю с коллегой на работе, подскажите есть ли множественное   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.028 c
3-1091517710
sergch
2004-08-03 11:21
2004.08.29
ADODataSet.Edit для одной таблицы в многотабличном запросе


14-1092171068
wnew
2004-08-11 00:51
2004.08.29
TRichEdit и кириллица


9-1083916006
MsShtaer
2004-05-07 11:46
2004.08.29
Помогите с выбором стиле к стратегической игре


3-1091532057
Jgn
2004-08-03 15:20
2004.08.29
CheckBox in EHGrid


14-1092201173
vov@n
2004-08-11 09:12
2004.08.29
Прогораммироавние в Delphi