Вниз
Скачать: CL | DM;

Что вообще обозначает   Найти похожие ветки 

← →
Пубертанец   (2003-07-18 09:21) [0]

Subj


← →
Skier ©   (2003-07-18 09:24) [1]

метакласс


← →
Alex Konshin ©   (2003-07-18 09:30) [2]

Тип - указатель на класс. По сути указатель на VMT.


← →
Digitman ©   (2003-07-18 09:42) [3]

Тип ссылки на класс, иногда называемый "метакласс", обозначается языковой конструкцией следующей формы :

class of type

где type - любой тип класса.
Идентификатор type сам по себе есть значение, тип которого - класс типа. Если type1 есть наследник type2, то конструкция class of type2 является совместимой (с т.з. языковых конструкций присвоения) с конструкцией class of type1.

Таким образом, код

type TClass = class of TObject;

var AnyObj: TClass;

объявляет переменную AnyObj, которая может содержать ссылку на любой класс.
Определение ссылочного классового типа не может присутствовать прямо в декларации переменной или в списке параметров, т.е. конструкция вида
var AnyObj: class of TObject;
недопустима

Переменной AnyObj можно присваивать nil.



← →
Юрий Зотов ©   (2003-07-18 09:48) [4]

> Alex Konshin © (18.07.03 09:30)

Дык... указатель на VMT - это же сам класс и есть. Метакласс -это скорее указатель на указатель на VMT


← →
Digitman ©   (2003-07-18 09:57) [5]


> Пубертанец


практическое применение (прочувствуй всю прелесть !):

type
TMyObject = class(TObject);
TMyObject1 = class(TMyObject);

TMyObjectClassRef = class of TMyObject;
var
MyObjectClassRef: TMyObjectClassRef;
MyObject: TMyObject;

function CreateInstanceOf(ClassRef: TMyObjectClassRef): TMyObject;
begin
Result := ClassRef.Create;
end;
...

MyObject := CreateInstanceOf(TMyObject); // создан экз-р TMyObject
...
MyObject := CreateInstanceOf(TMyObject1); // создан экз-р TMyObject1


← →
Skier ©   (2003-07-18 10:05) [6]

>Пубертанец (18.07.03 09:21)
+ Digitman © (18.07.03 09:57)
Прелесть ещё и в том что таким образом можно создавать
экз-ры объектов, зная только имя класса. Что, кстати, использует
Delphi при чтении файла формы


← →
Digitman ©   (2003-07-18 10:27) [7]


> Skier


да, конечно

уже иллюстрирую для автора :

type
TMyObject = class(TPersistent);
TMyObject1 = class(TMyObject);
TMyObject2 = class(TMyObject1);
TMyObject3 = class(TMyObject2);

TMyObjectClassRef = class of TMyObject;

var
MyObject: TMyObject;

function CreateInstanceOf(const RegisteredClassName: string): TMyObject;
begin
Result := GetClass(RegisteredClassName).Create;
end;
...

RegisterClasses([TMyObject, TMyObject1, TMyObject2, TMyObject3
]);
....
MyObject := CreateInstanceOf("TMyObject");
...
MyObject := CreateInstanceOf("TMyObject1");
...
MyObject := CreateInstanceOf("TMyObject2");
...
MyObject := CreateInstanceOf("TMyObject3");



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.012 c
6-10321
izx
2003-05-27 18:57
2003.08.04
Подключение из программы на Delphi к web серверу через proxy.


1-10227
AGAMEMNUM
2003-07-17 15:13
2003.08.04
Как послать проге CTRL+DEL?


1-10271
electric
2003-07-21 18:18
2003.08.04
Выделенные строки в ListView.


1-10228
LLOyD
2003-07-19 22:35
2003.08.04
Электронная трассировка


1-10278
Артем К
2003-07-22 02:22
2003.08.04
Как получить длину строки в пикселях




   Наверх