Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-1092308148
Zlodey
2004-08-12 14:55
2004.08.29
qtintf70.dll


10-1034156256
Sikkens
2002-10-09 13:37
2004.08.29
idl2cpp error!!! HELP!


3-1091445012
Солер
2004-08-02 15:10
2004.08.29
как открыть таблицу и изменить запросы малой кровью.


14-1092136775
Новенький
2004-08-10 15:19
2004.08.29
Помогите по железу


14-1091819687
ИМХО
2004-08-06 23:14
2004.08.29
"Курить иль не курить - вот в чем вопрос"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский