Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизА всё таки почему Найти похожие ветки
← →
Dimka Maslov © (2012-10-09 22:19) [0]ClassName это статический метод (class function), а ClassType - просто метод и без экземпляра его не вызвать?
← →
Дмитрий С © (2012-10-09 22:21) [1]var O:TObject;
O := TStirngList.Create;
ShowMessage(O.ClassName); -- тут TObject чтоли будет?
← →
Dimka Maslov © (2012-10-09 22:33) [2]тут будет TStirngList
Вопрос философский.
← →
Dimka Maslov © (2012-10-09 22:41) [3]Мне надо из TSomeGeneric<T> получить ClassType для T, но сделать это можно только создав экземпляр класса T. Или не только?
← →
Дмитрий С © (2012-10-09 22:54) [4]
> тут будет TStirngList
> Вопрос философский.
Как это TStirngList, если метод классовый?
← →
Игорь Шевченко © (2012-10-09 23:06) [5]
> Мне надо из TSomeGeneric<T> получить ClassType для T, но
> сделать это можно только создав экземпляр класса T. Или
> не только?
http://stackoverflow.com/questions/2559049/delphi-rtti-and-tobjectlisttobject
?
← →
DevilDevil © (2012-10-09 23:41) [6]потому что глупо брать ClassType у TClass. Ибо это одно и то же
а вот у экземпляра класса логично брать, какого он класса
← →
Юрий Зотов © (2012-10-09 23:53) [7]> Dimka Maslov © (09.10.12 22:19)
Если я еще не забыл Delphi, то вот мое ИМХО по сабжу.
Допустим, метод ClassType был бы классовым - что тогда должна была бы вернуть конструкция TMyClass.ClassType? Тот же TMyClass, который и так известен - поэтому практического смысла в ней нет.
← →
DVM © (2012-10-09 23:57) [8]
> Dimka Maslov © (09.10.12 22:19)
> ClassName это статический метод (class function),
это не статический метод, а классовый, статический метод это другое.
← →
oxffff © (2012-10-10 00:05) [9]
> Dimka Maslov © (09.10.12 22:19)
> ClassName это статический метод (class function), а ClassType
> - просто метод и без экземпляра его не вызвать?
Потому, что classtype применяется к экземпляру.
к метаклассу его применять нет смысла, это он и есть.
ClassName можно применить и к экземпляру и к метаклассу
(экземпляр неявно можно привести к метаклассу)
← →
oxffff © (2012-10-10 00:13) [10]
> Dimka Maslov © (09.10.12 22:41) [3]
> Мне надо из TSomeGeneric<T> получить ClassType для T, но
> сделать это можно только создав экземпляр класса T. Или
> не только?
procedure TForm1.abc<T>;
var A:TClass;
begin
A:=T;
end;
← →
oxffff © (2012-10-10 00:14) [11]Да и
TForm1=class....
procedure abc<T:class>;
.....
← →
oxffff © (2012-10-10 00:17) [12]
> Игорь Шевченко © (09.10.12 23:06) [5]
>
> > Мне надо из TSomeGeneric<T> получить ClassType для T,
> но
> > сделать это можно только создав экземпляр класса T. Или
>
> > не только?
>
>
> http://stackoverflow.com/questions/2559049/delphi-rtti-and-
> tobjectlisttobject
>
> ?
??
>
>
← →
Dimka Maslov © (2012-10-10 09:49) [13]
> Юрий Зотов © (09.10.12 23:53) [7]
В приведённом мною примере как раз ClassType может быть и неизвестен. Допустим я для некоторой общности создал несколько дженериков для разных классов, унаследовав их от одного предка с виртуальными методами. Потом в некоторой процедуре, в которую передаётся указатель на предка я могу спокойно вызывать виртуальные методы дженериков. Но мне надо знать, какой конкретно тип используется в дженерике.
TBase = object(TObject)
public
function NestedType: TClass; virtual; abstract;
end;
TGeneric<T: TSomeObject, constructor> = object(TBase)
public
function NestedType: TClass; override;
end;
function TGeneric<T>.NestedType: TClass;
begin
Result := T;
end;
Даёт невнятную ошибку компиляции "ожидалась скобка", какая скобка, почему скобка? Про через одно место написанную справку, в которой толком ничего не написано, я молчу.
function TGeneric<T>.NestedType: TClass;
begin
Result := T.ClassType;
end;
Проглатывается компилятором, но даёт access violation, ибо возвращает nil, потому-что ClassType не классовый метод!
Единственный способ получается
function TGeneric<T>.NestedType: TClass;
var
Obj: T;
begin
Obj := T.Create;
try
Result := Obj.ClassType;
finally
end;
end;
← →
jack128_ (2012-10-10 10:57) [14]эта бага компилера.
function TGeneric<T>.NestedType: TClass;
begin
Result := T;
end;
это должно нормально компилиться (если TSomeObject конечно). (и в d2010 компилируется)
← →
jack128_ (2012-10-10 10:57) [15]TBase = object(TObject)
а вот это не компилируется.
← →
Dimka Maslov © (2012-10-10 11:13) [16]
> jack128_ (10.10.12 10:57) [14]
У меня D2009 :(
> jack128_ (10.10.12 10:57) [15]
Class(TObject) это я с утра туплю
← →
oxffff © (2012-10-10 11:14) [17]
> TBase = object(TObject)
object?
← →
oxffff © (2012-10-10 11:15) [18]Все компилируется. Ибо нефиг. [17]
TBase = class(TObject)
public
function NestedType: TClass; virtual; abstract;
end;
TGeneric<T: Tbase, constructor> = class(TBase)
public
function NestedType: TClass; override;
end;
{ TGeneric<T> }
function TGeneric<T>.NestedType: TClass;
begin
result:=T;
end;
← →
jack128_ (2012-10-10 11:19) [19]
> У меня D2009 :(
d2009 и дженерики - несовместимы. Собственно у нас 2010 - и там глюков полно, а в 2009 вообще швах был. забей на них просто. считай, что у тебя дженериков нету.
← →
Dimka Maslov © (2012-10-10 11:35) [20]
> считай, что у тебя дженериков нету.
Раньше я это подозревал и не пользовался.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.063 c