Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить "Владельца", Странный вопрос. 
:(
    Опции темы
altarasjuk
Дата 4.9.2003, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



Всем привет!

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

Код

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

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


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

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

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

Это сообщение отредактировал(а) altarasjuk - 4.9.2003, 15:46


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
x77
Дата 4.9.2003, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



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


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
altarasjuk
Дата 4.9.2003, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



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


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
altarasjuk
Дата 4.9.2003, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



Мне грубо говоря нужен такой результат:
Код

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() ).


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
x77
Дата 4.9.2003, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



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

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



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
altarasjuk
Дата 4.9.2003, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



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

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


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
x77
Дата 4.9.2003, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



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


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
x77
Дата 4.9.2003, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



Цитата
т.е. fObjA может существовать сам по себе


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


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
x77
Дата 4.9.2003, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



т.е. вызов функции у тебя будет выглядеть так:

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



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
altarasjuk
Дата 5.9.2003, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



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


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
Fantasist
Дата 5.9.2003, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



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


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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
altarasjuk
Дата 6.9.2003, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 331
Регистрация: 7.5.2003
Где: Харьков

Репутация: 1
Всего: 1



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


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.