Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.5 MB
Время: 0.07 c
15-1345119186
stas
2012-08-16 16:13
2013.03.22
Расчет площади сложной фигуры


15-1336633312
jacksotnik
2012-05-10 11:01
2013.03.22
Закрыть файл


2-1346166751
avil
2012-08-28 19:12
2013.03.22
tcombobox со своими правилами


15-1341492118
Unknown user
2012-07-05 16:41
2013.03.22
Определить или открыто главное меню


3-1282589023
ddd329
2010-08-23 22:43
2013.03.22
Не исключаются BLOB - поля





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