Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ООП


Страницы:   1 2 3 4

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]

Без проблем. Может потребоваться опережающее объявление дочернего класса.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо