Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];

Вниз

Когда же наконец в Delphi for Win32 появятся дженерики   Найти похожие ветки 

 
XentaAbsenta   (2008-04-15 11:48) [0]

Сейчас я разрабатываю сервис для IRC, и из-за нехватки шаблонов и множественного наследования была даже мысль полностью пересесть на c++. Надо мной уже друзья смеются, называя меня шаблонизатором. Какие только трюки не приходится выкидывать чтобы не заниматься этим. Из-за нехватки этих фич код неимоверно распухает, хотя вполне можно было бы сделать его меньше. На самом деле HP разработала очень правильную библиотеку (STD), жаль, и очень жаль, что для делфей нет ничего подобного....
С нетерпением жду D2008.


 
tesseract ©   (2008-04-15 11:55) [1]


> и из-за нехватки шаблонов и множественного наследования
> была даже мысль полностью пересесть на c++.


TInterfacedObject  ?

ЗЫ : Почему просто классовую структурку не пририсовать хорошую ? Множественное наследование - палка о двух концах и одном геморое.

ЗЫ2 : А чего тут смешного, смеються те, кто две книжки проштудил и радуеться.


 
Palladin ©   (2008-04-15 12:02) [2]


> XentaAbsenta   (15.04.08 11:48)  

разруха, она, знаете ли, в головах

сколько лет разрабатываю и только считаные разы у меня мелькнула мысль, а вот здесь бы множественное наследование бы, было бы очень красиво... а шаблоны, в общем то прекрасно все разрабатывается и без них...


 
vuk ©   (2008-04-15 12:03) [3]

TInterfacedObject не лечит ни от отсутствия множественного наследования (если нужно именно наследование функциональности) ни от отсутствия дженериков.


 
Игорь Шевченко ©   (2008-04-15 12:11) [4]

ерундой страдаете уважаемый


 
oxffff ©   (2008-04-15 12:33) [5]


> vuk ©   (15.04.08 12:03) [3]


А что насчет делегирования реализации интерфейсу или объекту?
Механизм очень гибкий.


 
vuk ©   (2008-04-15 12:43) [6]

to oxffff ©   (15.04.08 12:33) [5]:
>А что насчет делегирования реализации интерфейсу или объекту?
А тут все просто. Делегирование - это не наследование. Причем, я согласен, множественное наследование - вещь, которая нужна крайне редко. Но заявлять о полной ненужность этой фичи, даже не имея под неё задач, не буду.


 
oxffff ©   (2008-04-15 12:49) [7]


> А тут все просто. Делегирование - это не наследование.


Делегирование реализации полный аналог множественного наследования.
Приведите пример обратного.

Причем множественное наследование (которое вы привозносите :) ) имеет неприятный артифакт. А именно вызов виртуальной функции в конструкторе.


 
Alkid ©   (2008-04-15 12:54) [8]


> XentaAbsenta   (15.04.08 11:48)

Не слушай их всех, я тебя поддерживаю.
Шаблоны - хорошо, дженерики - почти так же хорошою, как шаблоны :)
Без них можно, с ними - лучше. Опять же, парадокс Блаба.


 
vuk ©   (2008-04-15 13:01) [9]

to oxffff ©   (15.04.08 12:49) [7]:
>Приведите пример обратного.
Нет уж, если так хочится примеров, то это Вы приводите пример того, что это полный аналог. :)

>которое вы привозносите :)
Я? Это хде? :)


 
Игорь Шевченко ©   (2008-04-15 13:03) [10]

oxffff ©   (15.04.08 12:49) [7]


> Делегирование реализации полный аналог множественного наследования.


А мужики и не знали


 
Игорь Шевченко ©   (2008-04-15 13:04) [11]

oxffff ©   (15.04.08 12:49) [7]


> (которое вы привозносите :) ) имеет неприятный артифакт


превозносите.
артефакт.

пардон, spellchecker сработал


 
guav ©   (2008-04-15 13:06) [12]

> была даже мысль полностью пересесть на c++.

ну так а почему нет, что за Delphi держит ?


 
Alkid ©   (2008-04-15 13:17) [13]


> Делегирование реализации полный аналог множественного наследования.

Не совсем так.
Делегирование реализации аналогично ЗАКРЫТОМУ наследованию, когда новый класс является наследником, но не подтипом родителя. В этом смысле, делегирование нескольким классам аналогичено множественному закрытому наследованию, т.е:


class A : private B, private C
{
};

с точки зрения интерфейса аналогично

class A
{
private:
 B& b_delegate;
 C& c_delegate;
};


 
vuk ©   (2008-04-15 13:21) [14]

to Alkid ©   (15.04.08 13:17) [13]:

с точки зрения интерфейса аналогично

class A
{
private:
B& b_delegate;
C& c_delegate;
};


А это вообще агрегирование в чистом виде.


 
Alkid ©   (2008-04-15 13:27) [15]


> А это вообще агрегирование в чистом виде.

И что? Одно другом не мешает! :)


 
Slym ©   (2008-04-15 13:33) [16]

нафег эти дженерики? лучшеб inline функции (функция, но по месту применения инлайнится без call) сделали, так их нехватает...


 
Игорь Шевченко ©   (2008-04-15 13:35) [17]


> лучшеб inline функции (функция, но по месту применения инлайнится
> без call) сделали,


начиная с D2005 сделали.


 
guav ©   (2008-04-15 13:39) [18]

> [16] Slym ©   (15.04.08 13:33)

Чем лучше ? Кроме времени выполнения инлайн ни на что инлайн не влияет. А темплейты кое-что таки дают.


 
Slym ©   (2008-04-15 14:16) [19]

Игорь Шевченко ©   (15.04.08 13:35) [17]
начиная с D2005 сделали.

мдя... низнал... я сижу на 7 :), надо потестить как инлайнит
guav ©   (15.04.08 13:39) [18]
время иногда критично, особенно заметно - если вызываемая функция мала по размеру, но в цикле вызывается много раз


 
oxffff ©   (2008-04-15 14:32) [20]


> Alkid ©   (15.04.08 13:17) [13]
>

>vuk ©   (15.04.08 13:21) [14]

> > Делегирование реализации полный аналог множественного
> наследования.
>
> Не совсем так.
> Делегирование реализации аналогично ЗАКРЫТОМУ наследованию,
>  когда новый класс является наследником, но не подтипом
> родителя. В этом смысле, делегирование нескольким классам
> аналогичено множественному закрытому наследованию, т.е:
>
>
> class A : private B, private C
> {
> };
>
> с точки зрения интерфейса аналогично
>
> class A
> {
> private:
>  B& b_delegate;
>  C& c_delegate;
> };


Да ну? :)

Вы про ключевое слово implements в Delphi слышали?
Его можно помещать как в private, protected  и public разделы.
И соответственно внешняя видимость для внешней среды может оставаться, может и закрываться  причем и для дочерних классов.
Чего вам не нравится?

Если цикл жизни делегируемому агрегату совпадает с циклом жизни делегирующего функционал, то это тоже самое наследование.


 
Kolan ©   (2008-04-15 14:34) [21]

> мдя&#133 низнал&#133 я сижу на 7 :),

А ты думал, что если ты будешь долго сисдеть на D7, то туда добавят все что тебе надо? :)


 
Игорь Шевченко ©   (2008-04-15 14:45) [22]


> Вы про ключевое слово implements в Delphi слышали?


И какое отношение это слово имеет к множественному наследованию ?


 
jack128_   (2008-04-15 14:46) [23]


> время иногда критично, особенно заметно - если вызываемая
> функция мала по размеру, но в цикле вызывается много раз

ну инклюдь её руками, что мешает.

множественное наследование лично мне не нуно, а вот дженерики - было бы неплохо получить.  
И моя личная мечта - анонимные функции и кортежи :-)


 
oxffff ©   (2008-04-15 14:47) [24]


> Alkid ©   (15.04.08 12:54) [8]
>
> > XentaAbsenta   (15.04.08 11:48)
>
> Не слушай их всех, я тебя поддерживаю.
> Шаблоны - хорошо, дженерики - почти так же хорошою, как
> шаблоны :)
> Без них можно, с ними - лучше. Опять же, парадокс Блаба.
>


Только  generics поддерживает то, что принципиально нельзя в templates.
А именно инстанцирование шаблона Run time.  :)


 
Kolan ©   (2008-04-15 14:47) [25]

> анонимные функции и кортежи :-)

А чей-то такое?


 
Alkid ©   (2008-04-15 14:48) [26]


> Вы про ключевое слово implements в Delphi слышали?

Не, не слышал. На дельфи программировать закончил 1.5 года назад, и то была почти всё вермя пятёрка. Что это ключевое слово делает?


 
oxffff ©   (2008-04-15 14:50) [27]


> Игорь Шевченко ©   (15.04.08 14:45) [22]
>
> > Вы про ключевое слово implements в Delphi слышали?
>
>
> И какое отношение это слово имеет к множественному наследованию
> ?


Это имеет отношение к


> Делегирование реализации аналогично ЗАКРЫТОМУ наследованию,
>
>   когда новый класс является наследником, но не подтипом
>
>  родителя.


Фактически никто не мешает обойтись и без Implements.
Только implements позволяет быстрее и эффективнее (функции обертки-делегирующие вызов не нужны).


 
Palladin ©   (2008-04-15 14:51) [28]


> Alkid ©   (15.04.08 14:48) [26]

отделение мух от котлет при поддержке нескольких интерфейсов


 
Alkid ©   (2008-04-15 14:53) [29]


> отделение мух от котлет при поддержке нескольких интерфейсов

Да, я уже прогуглил этот вопрос :)
Занятная штука. Страуструп, кстати, подобное задумывал в С++, но в итоге отказался. В принципе это - синтаксический сахар, но это ХОРОШИЙ синтаксический сахар.


 
Игорь Шевченко ©   (2008-04-15 14:57) [30]

oxffff ©   (15.04.08 14:50) [27]

Речь шла о том, что реализация интерфейсов - это не наследование.


 
Alkid ©   (2008-04-15 15:01) [31]


> Речь шла о том, что реализация интерфейсов - это не наследование.

Формально - это не есть множественное наследование реализации. Но по сути даёт почти такие возможности, как и множественное наследование. А в чём-то даже по превосходит его. Так что я бы сказал, что с такой возможностью, идея множественного наследования реализации в НЕКОТРОЙ СТЕПЕНИ поддерживается в Дельфи.


 
oxffff ©   (2008-04-15 15:09) [32]


> Alkid ©   (15.04.08 14:48) [26]


ACLASS=class
procedure MethodOfClassA();
end;

BCLASS=class
procedure MethodOfClassB();
end;

ContractA=interface
["{F0B051B7-755B-481D-817C-A78BE6AABDAB}"]
procedure MethodOfClassA();
end;

ContractB=interface
["{2D6EAFD0-3CA8-495D-98A9-95ED3F4A1906}"]
procedure MethodOfClassB();
end;

CClass=class(TinterfacedObject,ContractA,ContractB)
InstanceA:ACLASS;
InstanceB:BCLASS;
protected
property InstanceARef:ACLASS read InstanceA implements ContractA;
property InstanceBRef:BCLASS read InstanceB implements ContractB;
public
constructor create;
destructor destroy;override;
end;


 
jack128_   (2008-04-15 15:11) [33]

кортежи - вот http://rsdn.ru/article/nemerle/NemerleIntro.xml#EUYAE

анонимные функции. что то не не найду. Вобщем по сути - функции, описываемые по месту вызова. Соответсвенно - не имеющие имени. Очень удобно в качестве каллбеков использовать.
например так:
Tcallback = function (AObj: TMyObj; Data: Pointer): boolean;
...
public
 function IterateChilds(Callback: TCallback): TMyObj;

function IterateChilds(Callback: TCallback): TMyObj;
begin
 for I := 0 to ChildCount then
   if Callback(Childs[I]) then
   begin
     Result := Childs[I];
     Exit;
   end;
 Result := nil
end;

Примеры

function FindByID(AID: Integer): TMyObj;
begin
 Result := IterateChild(<Result := AObj.ID = Integer(Data)>, Pointer(AID))
end

function FindByName(AName: string): TMyObj;
begin
 Result := IterateChild(<Result := AObj.Name = string(Data)>, Pointer(AName))
end

function IterateToList(AList: TList);
begin
 IterateChild(<TList(Data).Add(AObj);Result := False>, Pointer(AList))
end

или самый простой пример:  btnClose.OnClick := <Application.Terminate>;

в угловых скобках - анонимные функции.

PS вообще - почитай на rsdn статьи про немерле. там много интересного найдёшь.


 
Alkid ©   (2008-04-15 15:12) [34]


> oxffff ©   (15.04.08 15:09) [32]

Занятственно :)
Более многословно, чем множественное наследование в С++, но более гибко, ибо позволяет в рантайме менять "родителей".

Интересно сравнить такую модель комбинации классов с тем, как это в С++ реализовано.


 
oxffff ©   (2008-04-15 15:14) [35]


> Alkid ©   (15.04.08 15:01) [31]


Я бы сказал, что не уступает во всяком случае при грамотном использовании.

Фактически  implements вставляет аналог делегирующей функции в виде в слот VMT интерфейса  в виде подстройки смещения и перехода на реализацию.


 
oxffff ©   (2008-04-15 15:16) [36]


> ибо позволяет в рантайме менять "родителей".


Ну на с++ тоже самое написать можно, но ручками. :)


 
oxffff ©   (2008-04-15 15:19) [37]


> ибо позволяет в рантайме менять "родителей".


да и не забываем что семантика класса в С++ это value type (стек), а в Delphi это ref type(куча, неуправляемая :) ).


 
Alkid ©   (2008-04-15 15:25) [38]


> oxffff ©   (15.04.08 15:14) [35]

Ну, что он куда вставляет - это технические детали :) Меня интересуют другие вещи.
Если рассматривать данный механизм, как инстумент построения архитектуры программы, то приходим к чему-то похожему на Smalltalk с его отдельным наследованием интерфейсов, т.е. основное дерево (граф?) наследования строится именно на интерфейсах (контрактах), а стоящие за ними реализации не обязаны образовывать некую стройную схему, возможно оставаясь фрагментарыми.

Вопрос для обсуждения - эта схема позволяет реализовывать миксины? Т.е. когда я пишу класс, реализующий *часть* интерфейса и скидываю на него реализацию этой части, беря реализацию оставшейся части из другого класса или определяя у себя? Очевидно, что такое можно реализовать, руками расписывая заглушки вида:

procedure TMyClass.MyMethod()
begin
 delegate.MyMethod();
end;

Но это неудобственно. В принципе, виртуальное наследование в С++ решает подобную проблему. А тут как получается?


 
Alkid ©   (2008-04-15 15:26) [39]


> > ибо позволяет в рантайме менять "родителей".
> Ну на с++ тоже самое написать можно, но ручками. :)

Да. Не хватает настоящего метапрограммирования в С++. И много где :)


> да и не забываем что семантика класса в С++ это value type
> (стек), а в Delphi это ref type(куча, неуправляемая :) ).

Гы. А указатели и ссылки для кого придуманы? :) И целый зоопарк смартпоинтеров туда же.


 
oxffff ©   (2008-04-15 15:29) [40]


>  А тут как получается?


Здесь очень хорошо это получается. А именно.

ACLASS=class
procedure MethodOfClassA();
end;

BCLASS=class
procedure MethodOfClassB();
procedure MethodOfClassC();
end;

ContractA=interface
["{F0B051B7-755B-481D-817C-A78BE6AABDAB}"]
procedure MethodOfClassA();
end;

ContractB=interface
["{2D6EAFD0-3CA8-495D-98A9-95ED3F4A1906}"]
procedure MethodOfClassC();
procedure MethodOfClassB();
end;

CClass=class(TinterfacedObject,ContractA,ContractB)
InstanceA:ACLASS;
InstanceB:BCLASS;
protected
procedure MethodOfClassCLocal();
procedure ContractB.MethodOfClassC=MethodOfClassCLocal;


property InstanceARef:ACLASS read InstanceA implements ContractA;
property InstanceBRef:BCLASS read InstanceB implements ContractB;
public
constructor create;
destructor destroy;override;
end;



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.048 c
2-1209995988
Инна
2008-05-05 17:59
2008.06.01
Запрос и удаление


15-1207024720
snake-as
2008-04-01 08:38
2008.06.01
GSM - шлюз


2-1210328992
Vasja
2008-05-09 14:29
2008.06.01
Как на форме отобразить картинку


2-1210144844
Grant
2008-05-07 11:20
2008.06.01
Runtime пакеты


15-1208798690
NaRuTo
2008-04-21 21:24
2008.06.01
Delphi VS C++





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский