Форум: "Прочее";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];
ВнизСоздание обеъктов в 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c