Главная страница
    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.49 MB
Время: 0.072 c
15-1333905177
U+
2012-04-08 21:12
2013.03.22
Как подключить модуль через IN?


6-1220943397
Layner
2008-09-09 10:56
2013.03.22
Расшифровать: " =?utf-8?Q?=D0=A0=D0=B0="....


15-1335039032
Andryk
2012-04-22 00:10
2013.03.22
Всем привет, тутже есть математики?)))


3-1285656778
ABolnykh
2010-09-28 10:52
2013.03.22
Как предотвратить появление окна запроса пароля PasswordDialog?


2-1330854206
wymkent
2012-03-04 13:43
2013.03.22
HelpDesk





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