![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что такое class of ?
TStas © (2008-05-05 18:55:00)Что такое Array of я понимаю (слава Богу, три года пишу на Дельфях), но только сегодня впервые увидел вот такую штуку:
TWinControlClass = class of TWinControl;
Что это и как с ней бороться.
Юрий Зотов (2008-05-18 23:58:00) [1]> TStas © (18.05.08 23:57) [7]
Есть. У Конопки - точно.
TStas (2008-05-18 23:57:00) [2]Вот, между прочем, про class of тоже нет ни в одной книжке.
Восхищенный (2008-05-05 20:40:00) [3]Добавление.
Ключевое слово virtual в объявлении конструктора прерывает его старую цепочку наследования и начинает новую, а ключевое слово reintroduce говорит компилятору, что старый конструктор закрыт умышленно.
Восхищенный (2008-05-05 20:37:00) [4]> TStas © (05.05.08 19:19) [4]
> Мне просто не нравится переопределять гордое имя конструктора.
Можно и не переопределять, и тот же механизм метаклассов с виртуальными конструкторами использовать.
type
TMyClass = class(...)
public
constructor Create(свои_параметры); reintroduce; virtual;
end;
TMyClassFamily = class of TMyClass;
TMyClass2 = class(TMyClass)
...
end;
TMyClass3 = class(TMyClass)
...
end;
TMyClass4 = class(TMyClass2)
...
end;
function CreateMyClassInstance(MyClass: TMyClassFamily): TMyClass;
begin
Result := MyClass.Create(свои_параметры);
end;
var
MyObject: TMyClass;
MyObject := CreateMyClassInstance(TMyClass);
MyObject := CreateMyClassInstance(TMyClass2);
MyObject := CreateMyClassInstance(TMyClass3);
MyObject := CreateMyClassInstance(TMyClass4);
TStas (2008-05-05 19:19:00) [5]Мне просто не нравится переопределять гордое имя конструктора. Дело в том, что мне сейчас нужно сохранять в файл граф. Притом этот граф, зараза, почти произвольный - это схема риэлтерской сделки, а цепочки там могут быть весьма длинными. Дерево, то бишь TTreeNode ну никак не годится, т. к. ветки у него никак не могут замыкаться, да и пользователю неудобно будет с ним работать. Поэтому пришлось писать своё... Стрелочка, чтобы их соединять, у меня с прошлой проги осталась. Ну, вот и встречаю всякие новости для себя.
Palladin (2008-05-05 19:05:00) [6]именно вкупе с этим и используются виртуальные конструкторы и именно по этому я тебе рекомендовал не делать реинтродьюс, а описать свой под другим именем.
тип class of TКакойТоКласс означает что переменная этого типа является классом (класс, в делфи, это тоже конкретная, а не абстрактная сущность) или наследником класса TКакойТоКласс.
зачем это нужно? например механизм сериализации компонентов VCL построен на этом. вообще это очень мощная вещь...
{RASkov} (2008-05-05 19:00:00) [7]Это называется ссылка на класс...
Вот возможный пример
type TControlClass = class of TControl; //уже есть стандартное описание
var ORef: TControlClass;
Obj: TControl;
begin
if CreateButton then ORef:=TButton else ORef:=TLabel;
Obj:=Oref.Create();
....
end;
Reindeer Moss Eater (2008-05-05 18:59:00) [8]Тип для хранения ссылки на класс.