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

Вниз

Создание обеъктов в generic классах   Найти похожие ветки 

 
jack128_   (2008-12-20 16:32) [0]

Delphi 2009
Имеем код:
type
 TComponentList<T: TComponent> = class
 private
    FItems: TList<TComponent>;
 public
   function Add: T;
 end;

function TComponentList<T>Add: T;
begin
 Result := T.Create(nil); // не компилится
 FItems.Add(Result);
end;

если добавить ограничение
TComponentList<T: TComponent, constructor>

то можно создать таким макаром:  Result := T.Create; что естественно не катит.  Тут будет вызван унаследуемый от TObject конструктор.  Result := T.Create(nil); всё так же не компилится...

Так как нормально создать компонент в generic-классе, кто нить знает??


 
jack128_   (2008-12-20 17:06) [1]

в общем у меня только так получается:


function TComponentList<T>Add: T;
begin
 Result := nil;
 try
   Result := T.NewInstance as TComponent;
   Result.Create(nil);
 except
   FreeAndNil(Result);
   raise;
 end;
 FItems.Add(Result);
end;


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


 
Ins ©   (2008-12-20 17:40) [2]

Да, странно однако. А если TComponent(T) попробовать чисто эксперимента ради? У меня 2009 нет, не могу проверить...

function TComponentList<T>Add: T;
begin
Result := TComponent(T).Create(nil);
FItems.Add(Result);
end;


 
jack128_   (2008-12-20 17:57) [3]


> Result := TComponent(T).Create(nil);

ты наверно имел в виду Result := TComponentClass(T).Create(nil);  нет, так тоже не компилируется.  Вообще - в обощенным параметрам не применимы операторы, даже те, которые по идее нормально должны работать.. например так

var
 O: TObject;
 C: T;
begin
 C := O as T; // не компилится
end;


 
Ins ©   (2008-12-20 18:03) [4]


> ты наверно имел в виду Result := TComponentClass(T).Create(nil);


Угу


> нет, так тоже не компилируется.  Вообще - в обощенным параметрам
> не применимы операторы, даже те, которые по идее нормально
> должны работать.. например так


Темный лес эти дженерики, жалко


 
oxffff ©   (2008-12-20 22:36) [5]


> jack128_   (20.12.08 16:32)  


Проблема растет из .NET.

Я только что внимательно изучил суть кода в VS и почитал описание IL инструкции newobj.

А именно из ограничения IL инструкции newobj.
Есть у нее параметр ctor

ctor is a metadata token (a methodref or methodef that shall be marked as a constructor; Проблема в том, что это должен быть метод конкретного класса.

Для ограничения C# where T:new() компилятор генерирует код создания через System.Activator.
Причина повидимому в том, что у подкласса может быть такой же конструктор неперекрытый. И при передаче подкласса в качестве typed параметра может быть вызван коснтруктор родителя, что естественно не верно. А связать имя конструктора и typed параметр типа через methodref or methodef нельзя. Такие дела с этим .NET.

P.S. Самое интересное, что я под .NET не программирую вовсе.

P.P.S. Ребята из Codegear реально накосячили применив полностью идеалогию .NET generics к native Delphi.
Я больше чем уверен, что это станет им боком и очень сильно.



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

Текущий архив: 2009.02.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
13-1122989175
cherrex
2005-08-02 17:26
2009.02.15
Не могу запустить приложение в DELPHI 2005


2-1230325419
programmer90
2008-12-27 00:03
2009.02.15
Хочу большие String-и:)


2-1231250146
Семён
2009-01-06 16:55
2009.02.15
Как изменить содержимое 2-й строки ListView без Clear?


6-1198506555
Palladin
2007-12-24 17:29
2009.02.15
WinInet и ERROR_INTERNET_SECURE_CHANNEL_ERROR


2-1230991906
demon
2009-01-03 17:11
2009.02.15
Падсказка над иконкой в трее