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

Вниз

А всё таки почему   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.057 c
3-1284795538
vhm
2010-09-18 11:38
2013.03.22
Подключение к MySQL


2-1328461488
Xmen
2012-02-05 21:04
2013.03.22
архивация открытого документа


2-1328170170
AV
2012-02-02 12:09
2013.03.22
Запрос к MSSSQL не возвращает данные. Почему?


15-1333917002
Юрий
2012-04-09 00:30
2013.03.22
С днем рождения ! 9 апреля 2012 понедельник


15-1346868099
Nic
2012-09-05 22:01
2013.03.22
Как сделать онлайн сервис?