Текущий архив: 2003.02.03;
Скачать: CL | DM;
Вниз
Что за директива class of ? Найти похожие ветки
← →
Lapuh (2003-01-14 21:10) [0]Например, встретил такое в исходниках VCL и понял, что ничего не понял:
TTreeNodeClass = class of TTreeNode
Что за class of ? И кто тогда TTreeNodeClass по отношению к TTreeNode ?
← →
vuk © (2003-01-14 21:22) [1]Так объявляется ссылка на класс. Если имеется переменная такого типа, то значение, которое можно ей присвоить - тот класс, который написан в объявлении такого типа или любой его наследник. Имея такую переменную можно вызывать через нее методы класса и конструкторы (для конструкторов правильность вызова обеспечивается при использовании виртуальных конструкторов).
например, в VCL имеется объявление:
TComponentClass = class of TComponent;
Можно, например, написать такую функцию:
function CreateComponent(AClass: TComponentClass) : TComponent;
begin
Result := AClass.Create(nil);
//вызывается виртуальный конструктор,
//который объявлен так:
//constructor Create(AOwner: TComponent); virtual;
end;
Вызов этой функции может быть таким:
SomeComponent := CreateComponent(TButton);
SomeOtherComponent := CreateComponent(TForm);
Этот пример не имеет особого смысла, он просто демонстрирует, способ использования ссылок на класс.
← →
Сатир © (2003-01-14 21:28) [2]2vuk © (14.01.03 21:22)
то есть, это как одна из альтернатив приведения типов typecast
TComponent(TForm), TComponent(TButton)?
← →
vuk © (2003-01-14 21:35) [3]Не совсем. В Delphi класс не только некая абстракция языка, но и вещь которую можно пощупать, передать как параметр, вызвать методы, ощутить полиморфизм методов класса, в общем, почти как экземпляр обычного класса.
← →
vuk © (2003-01-14 21:52) [4]Добавлю, что в случае с TTreeNodeClass, этот тип используется для того, чтобы возвратить в качестве параметра обработчика события ссылку на класс, экземпляр которого нужно создать:
function TCustomTreeView.CreateNode: TTreeNode;
var
LClass: TTreeNodeClass;
begin
LClass := TTreeNode;
if Assigned(FOnCreateNodeClass) then
FOnCreateNodeClass(Self, LClass);
Result := LClass.Create(Items);
end;
← →
Сатир © (2003-01-14 22:02) [5]<offtopic>век живи, век учись... и помирай дураком%) </offtopic>
← →
vuk © (2003-01-14 22:15) [6]Ну... Вообще говоря на ссылках на класс вся VCL и держится...
← →
Lapuh (2003-01-14 22:31) [7]>Так объявляется ссылка на класс
А что тогда:
var A:TObject
?
← →
vuk © (2003-01-14 22:33) [8]Объявление переменной экземпляра.
← →
Lapuh (2003-01-14 23:40) [9]Ну так ведь это тоже ссылка ?
А-а-а... это ведь ссылка на экземпляр класса...
А class of - это как бы ссылка на класс в таблице классов ?
← →
vuk © (2003-01-15 00:40) [10]Для начала поправлю сам себя.
>Объявление переменной экземпляра.
Думал об одном, а написал другое. Следовало написать так: объявление переменной для хранения ссылки на экземпляр. Переменными же экземпляра называют переменные, принадлежащие экземпляру - объявленные внутри определения класса.
>А class of - это как бы ссылка на класс в таблице классов ?
Вы почти попали в точку. class of - это объявление типа данных для такой ссылки. А вот если написать A: TTreeNodeClass, то A - это как раз оно самое и есть, ссылка на класс. Но, тем не менее, никакой доступной программисту таблицы классов в приложении нет.
Вообще говоря, типы ссылок на класс также называют метаклассами. Метакласс - это такой специальный вид классов, экземплярами которого являются обычные классы.
Страницы: 1 вся ветка
Текущий архив: 2003.02.03;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.015 c