Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-5169
AlexandrRya
2003-01-16 00:14
2003.02.03
Снова о бесплатном


3-4759
Relict
2003-01-15 11:57
2003.02.03
опять запись/чтение рисунков ... ну не получается...


9-4699
Javlon
2002-08-09 14:06
2003.02.03
3DS format как открыт с техтурами


14-5270
Eugenex
2003-01-17 10:35
2003.02.03
Кто видел эту JWA? A где?


1-5001
Valeris
2003-01-23 16:42
2003.02.03
Функция замены одного символа на другой