Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как получить "Владельца"


Автор: altarasjuk 4.9.2003, 15:44
Всем привет!

Представим такую ситуацию

Код

...
TObjectA = class ...
 ...
end;

TObjectB = class (TObjectC)
private
 fObjA: TObjectA;
 ...
protected
 function GetSome(): TObject;
 ...
end;
...


Так вот вопрос:

1. Как определить кто (является ли потомоком TObjectC этот некто) "владеет" fObjA?
2. Если TObjectC - то вызвать метод GetSome. (Если выразиться правильнее, то получит ссылку на данный экземпляр класса TObjectB).

Вариант с передачей ссылки в конструкторе не подходит. Или такой вариант вообще невозможен?

Автор: x77 4.9.2003, 16:03
не могу представить ситуацию, когда известно поле класса, но неизвестно, кому оно принадлежит. а если известно кому - то определить тип этого кого-то, простите, [censored34! Пожалуйста, соблюдайте элементарные правила приличия при общении на форуме] вопрос. видимо я чего-то не догнал. но на всякий случай посмотри справку по методу ClassParent, может, поможет smile.gif

Автор: altarasjuk 4.9.2003, 16:21
Объекту A не известно.
1 вопрос, действительно протормозил - снимаем.
2 вопрос перефразирую так: Надо получить экземпляр данного класса.

Автор: altarasjuk 4.9.2003, 16:28
Мне грубо говоря нужен такой результат:
Код

TObjectA = class ...
private
 fOwner: TObject
...
public
 constructor Create(aOwner: TObject);
end;

TObjectB = class (TObjectC)
private
fObjA: TObjectA;
...
protected
function GetSome(): TObject;
...
end;

.....

constructor TObjectA.Create(aOwner: Tobject);
begin
 fOwner:= aOwner;
end;

constructor TObjectB.Create;
begin
 fObjA:= TObjectA.Create(Self);
end;

Но только чтобы у конструктора TObjectA был только конструктор по умолчанию ( Create() ).

Автор: x77 4.9.2003, 16:34
т.е. fObjA может существовать сам по себе, а может - в качестве поля класса, и во втором случае, если класс является наследником TObjectC, требуется запустить метод этого класса GetSome, я правильно понимаю?

если да, то без Parent ничего здесь сделать невозможно, imho. недаром вся vcl (ну, почти) создаётся с ссылкой на предка. чем не устраивает вариант с передачей ссылки в конструкторе?

Автор: altarasjuk 4.9.2003, 16:38
Цитата
чем не устраивает вариант с передачей ссылки в конструкторе?
ответ:
1)
Цитата
т.е. fObjA может существовать сам по себе

2)"Владельцу" вовсе не обязательно знать что о нём кто-то что-то знает.
Вариант с передачей ссылки - остаётся на крайняк smile.gif

Автор: x77 4.9.2003, 16:38
понятия "конструктор по умолчанию" в vcl не существует, TObject.Create даже не инициализирует данные, он просто отводит память под объект и основное его назначение - вызвать destructor, если create обломится. т.е. можно с совершенно спокойной головой как угодно глумиться над конструкторами наследников TObject. в чём здесь проблема?

Автор: x77 4.9.2003, 16:39
Цитата
т.е. fObjA может существовать сам по себе


ну и передавай в него nil. а в TObjectA проверяй, чему у тебя реально равен Owner перед тем, как его юзать. не понимаю, в чём проблема smile.gif

Автор: x77 4.9.2003, 16:49
т.е. вызов функции у тебя будет выглядеть так:

Код
...
if fObjA.Owner <> nil then
 fObjA.Owner.GetSome ();
...

Автор: altarasjuk 5.9.2003, 12:11
Цитата
ну и передавай в него nil. а в TObjectA проверяй, чему у тебя реально равен Owner перед тем, как его юзать. не понимаю, в чём проблема 
Ну если уж передавать, то понятно как это всё ловить, а теперь, если представить ситуацию, что в коде (и не одной программы) вызовов .Create() эдак 1000, т.е. это не новый объект, а upgrade старого sad.gif.
C таким успехом можно сдлать перегруженный конструктор..... Но опять же в где-то 100 местах нужна ссылка на "владельца". Не очень бы хотелось вылавлить эти места и дописывать скобки с сэлфом.....
Ну уж коль нет других вариантов, то что ж. Оставлю для совместимости старый конструктор, и сделаю перегруженный новый......... и чем я думал когда клепал этот класс раньше smile.gif.
Но всё равно должен быть в природе какой-тоалгоритм, чтобы понять откуда был вызван конструктор. smile.gif

Автор: Fantasist 5.9.2003, 17:48
Цитата
Но всё равно должен быть в природе какой-тоалгоритм, чтобы понять откуда был вызван конструктор


Неа, не должен. Нет, в принципе он, конечно, есть - можно прочитать call stack и выудить оттуда место откуда функция была вызвана, а так же из стека вытащить нужный тебе параметр. Но вряд ли ты этим захочешь заниматься.

Автор: altarasjuk 6.9.2003, 20:08
Цитата
Но вряд ли ты этим захочешь заниматься.
Это уж точно smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)