Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1229502288
zorik
2008-12-17 11:24
2009.02.15
Подскажите реальный пример использования Синглтона


4-1205362998
Jolik
2008-03-13 02:03
2009.02.15
Как узнать выполняется моя функция в основной нитке...


15-1229592896
@!!ex
2008-12-18 12:34
2009.02.15
Кто исполнитель??


15-1229467237
Керк
2008-12-17 01:40
2009.02.15
Интересный текст


2-1231168615
Цукор5
2009-01-05 18:16
2009.02.15
StringReplace





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