![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ООП
v2 © (2010-12-13 03:10:00)Можно ли создать (вызвать Create) дочерний объект из базового класса?
Игорь Шевченко (2010-12-14 19:03:00) [61]
> Кто сказал?
объявление в System.pas
v2 (2010-12-14 17:46:00) [62][13]:
>Free - статичный метод TObject.
Кто сказал?
>> TChild.Free( hidden ( T =>object Self) )
Можно понимать как:
Вызов procedure TChild.Free; с передачей в нее скрытого параметра Т, который в самой Free будет признан за Self
Ega23 (2010-12-14 16:51:00) [63]
(TObject(T) as Self).Free;
Бьюсь башкой об клаву...
Free - статичный метод TObject.
v2 (2010-12-14 16:26:00) [64]Спасибо!
Немного поковырялся :
[2]:
>Можно. (!)
В нестатическую процедуру класса передается скрытый параметр , который есть 'тип объекта', - тесть можно вот так:
TBase =class;
TChild= class(TBase)
class procedure TBase.Load;
var T:Pointer;
begin
T:=Self.Create; // => TChild.Create (!)
ObjsList.Add(t);
end;
class procedure TBase.Fin;
var T:Pointer;
begin
Save;
…
T:= ObjsList[i];
(TObject(T) as Self).Free; //=> TChild.Free( hidden ( T =>object Self) ) (!)
ObjsList.Extract(T);
…
end;
class procedure TChild.Init;
begin
...
Load; // => TBase.Load
end;
[10]:
>Никак. (?)
Можно, но 'руками', используя тот же class Self в качестве идентификатора текущего дочернего класса…
Попозже покажу где-то примерчик.
_Юрий (2010-12-13 20:51:00) [65]
> Сделайте виртуальные классовые методы, которые возвращают
> в потомках другие экземпляры переменной
А саму переменную соответственно уберите (если она долнга быть разной для разных потомков).
_Юрий (2010-12-13 20:49:00) [66]
> Юрий Зотов © (13.12.10 17:01) [9]
> Что такое class var?
Это новый синтаксис - классовая переменная
по экземпляру на класс
> Как сделать class var TBase.Var уникальной для разных классов
> наследников => ( @TChild01.TBase.Var <> @TChild02.TBase.
> Var )
Никак.
Сделайте виртуальные классовые методы, которые возвращают в потомках другие экземпляры переменной
Юрий Зотов (2010-12-13 17:01:00) [67]> v2 © (13.12.10 15:57) [6]
> [5]: Идея такова: TChild где-нибудь в class procedure TChild.Init заполняет
> class var TBase.DataStruct offset'ами своих полей и их размерами
И что произойдет, если какое-то поле есть длинная строка, динамический масссив, объект или любой другой указатель? А ведь такое встречается часто.
> TBase в Load (который будет вызван в TChild.Init) создает TChild'ов и
> наполняет.
Почему бы не использовать стандартную сериализацию VCL? См.справку по классу TPersistent.
> Как сделать class var TBase.Var уникальной для разных классов
> наследников => ( @TChild01.TBase.Var <> @TChild02.TBase.Var )
Прочитал. Долго думал. Не понял. Так 3 раза. Все равно ничего не понял. ТАКОГО языка я просто не знаю.
Что такое class var?
Что такое var TBase?
Что такое TBase.Var?
Зачем здесь взятие адреса?
Что такое TChild01.TBase?
oxffff (2010-12-13 16:08:00) [68]Не смогу помочь.
Ega23 (2010-12-13 16:06:00) [69]
> Пока делаю через class var TBase.PtrToNewChildFunc
Успехов.
@TChild01.TBase.Var <> @TChild02.TBase.Var
Орех.
v2 (2010-12-13 15:57:00) [70][4]: получаем TChild = class(TAncestor), а хотелось бы TChild = class(TBase) и, по возможности, TBase должен быть в библиотечном модуле.
[5]: Идея такова: TChild где-нибудь в class procedure TChild.Init заполняет class var TBase.DataStruct offset'ами своих полей и их размерами, а TBase в Load (который будет вызван в TChild.Init) создает TChild'ов и наполняет.
Пока делаю через class var TBase.PtrToNewChildFunc
Но попутно еще вопрос:
Как сделать class var TBase.Var уникальной для разных классов наследников => ( @TChild01.TBase.Var <> @TChild02.TBase.Var )
Юрий Зотов (2010-12-13 15:16:00) [71]Добавление к [4]: поток входных данных должен содержать имя фактического дочернего класса, а сами дочерние классы должны быть зарегистрированы. Тогда, прочитав из потока имя класса, мы сможем создать его экземпляр.
Ega23 (2010-12-13 14:30:00) [72]
TAncestor = class (TObject)
public
constructor Create; virtual;
end;
TAncestorClass = class of TAncestor;
TChild = class (TAncestor)
public
constructor Create; override;
end;
TBase = class (.....)
class procedure Load;
property AncestorClass: TAncestorClass read FAncestorClass write FAncestorClass;
end;
class procedure TBase.Load;
begin
with FAncestorClass.Create do
begin
end;
end;
v2 (2010-12-13 14:22:00) [73]Базовый класс должен автоматизировать создание дочерних объектов из потока входящих данных:
---------
unit A;
class procedure TBase.Load;
var
newTChild : Pointer; //?
begin
newTChild := TChild.Create; // ???
...
end;
-----------
unit B;
TChild=class(TBase);
...
Ega23 (2010-12-13 08:03:00) [74]Можно. Но вопрос поставлен некорректно, требуется уточнение.
Юрий Зотов (2010-12-13 03:25:00) [75]Без проблем. Может потребоваться опережающее объявление дочернего класса.