Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

Композитивный класс   Найти похожие ветки 

 
KitsumVI ©   (2005-11-21 08:32) [0]

Необходимо включить (статически) в класс массив объектов  другого класса, причем:
1.Из вне необходим доступ к объектам  внешнего и  внутреннего класса
2.Из внешнего класса необходим доступ к объектам   внутреннего класса
3Из внутреннего  класса необходим доступ к объектам внешнего класса, причем в конструкторе.
Как это можно попроще проделать?
Заранее благодарю, KitsumVI


 
ЮЮ ©   (2005-11-21 08:52) [1]

См.Help по TCollection, там приведен целый список наследников. Присоединяйся!


 
Думкин ©   (2005-11-21 08:57) [2]

TOuter = class;

TInner = class
private
 Outer : TOuter;
public
 constructor MyCreate(_Outer : TOuter);
end;

TOuter = class
private
 FList : TObjectList;
public
 property Items[i : integer] : TInner read GetInner; default;
 procedure AddInner(Params : ???);
end;


Можно в таком духе.


 
KitsumVI ©   (2005-11-21 09:29) [3]

Спасибо за советы, но хотелось чего-нибудь статического :-) вроде
FArray[1..2] of TInner;


 
Anatoly Podgoretsky ©   (2005-11-21 09:36) [4]

KitsumVI ©   (21.11.05 09:29) [3]
В чем проблема?
Заменить FList на FArray


 
tesseract ©   (2005-11-21 10:22) [5]


> Необходимо включить (статически) в класс массив объектов
>  другого класса, причем:


Delphi поддерживает только динамические классы.


> Как это можно попроще проделать?


Tlist.


> Спасибо за советы, но хотелось чего-нибудь статического


А зачем ? TLIST - базовый класс на котором строится половина VCL.


 
evvcom ©   (2005-11-21 15:24) [6]


> Delphi поддерживает только динамические классы.

м...м... Переведи. Вполне сойдет и
FArray: array[1..2] of TInner;
это "динамический" или "статический" класс? :)


 
tesseract ©   (2005-11-21 18:12) [7]


> это "динамический" или "статический" класс? :)

Этоне класс это массив ссылок на клас Tinner.

Рекомендую просмотреть VCL. Там у каждого элемента есть ссылки на родителя(parent) и хоязина (owner). Также каждый родительский класс VCL имеет ссылку на своих потомков (чтобы их освобождать). Под твой случай хватит.

ЗЫ : почитайц всё-таки про ООП.


 
KitsumVI ©   (2005-11-22 17:13) [8]


> В чем проблема?
> Заменить FList на FArray

Хотелось бы узнать еще при этой жизни как это работает а именно:
1.В какой последовательность происходит инициализация классов внешний-  внутренний или наоборот? Важно для возможность читать поля в конструкторах.
2. Сколько конструкторов нужно (можно) заводить: внешний, внутренний или оба?
3. Как обратиться снаружи и из внешнего класса к  объектам внутреннего класса?
4. Как обратится из внутреннего класса к объектам внешнего класса и как во внутреннем классе узнать  какой  по номеру внутренний объект вызывался?

Прошу извинить за процедуро-ориетированную отрыжку.

Заранее благодарю, KitsumVI


 
Digitman ©   (2005-11-22 18:09) [9]


> 1.В какой последовательность происходит инициализация классов
> внешний-  внутренний или наоборот?


в коде конструирования/инициализации "внешнего" объекта происходит инициализация его полей, в т.ч. и полей, являющих собой ссылки на объекты других ("внутренних") классов ... и никак иначе


> 2. Сколько конструкторов нужно (можно) заводить: внешний,
>  внутренний или оба?


у каждого класса, ВНЕ зависимости от их "внутренности" или "внешнести" в данном контексте, должен иметься конструирующий метод его экземпляров ... и никак иначе


> 3. Как обратиться снаружи и из внешнего класса к  объектам
> внутреннего класса?


ссылки на "внутренние" объекты данного класса должны иметь достаточную область видимости для объектов других ("внешних") классов


 
Думкин ©   (2005-11-23 06:53) [10]

> 1.В какой последовательность происходит инициализация классов
> внешний-  внутренний или наоборот? Важно для возможность
> читать поля в конструкторах.


Сначала создаешь внешний(TOuter). Затем добавляешьс помощью метода AddInner с передачей данных необходимых для верного создания объекта(TInner).

> 2. Сколько конструкторов нужно (можно) заводить: внешний,
>  внутренний или оба?

Можно сколько угодно. Решать тебе. И что значит внешний, внутренний конструктор?

> 3. Как обратиться снаружи и из внешнего класса к  объектам
> внутреннего класса?


A : TOuter;
B : TInner;//(Пусть есть метод Pip)

A.AddInner(------);.....

B := A[0];
B.Pip;
//или
A[0].Pip;


4. Как обратится из внутреннего класса к объектам внешнего класса и как во внутреннем классе узнать  какой  по номеру внутренний объект вызывался?

а. B.Outer.
Поле Outer инициализируется в конструкторе(передается ему как параметр).

б. Для этого в TOuter должен быть соответствующий метод, который должен уметь по соответсвующему экземпляру TInner сообщить:
 Есть ли такой объект в его контейнере и если есть - то его номер.
Пусть будет в TOuter(кстати TObjectList - имеет подобный метод):
function  WhatNumber ( _B : TInner) : integer;

Тогда в методе TInner:

Number := Outer.WhatNumber(self);



Страницы: 1 вся ветка

Текущий архив: 2005.12.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
14-1132584149
manulo
2005-11-21 17:42
2005.12.11
LPT


14-1132238472
Jeer
2005-11-17 17:41
2005.12.11
Кризис "среднего" возраста


4-1128553402
П7
2005-10-06 03:03
2005.12.11
WinProc = метод класса. Как?


1-1131994208
Sam Stone
2005-11-14 21:50
2005.12.11
Метод при наследовании


14-1132341956
Separator
2005-11-18 22:25
2005.12.11
Firewall