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

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

Композитивный класс [D7, XP]


KitsumVI ©   (2005-11-21 08:32:00) 

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


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

> 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);


Digitman   (2005-11-22 18:09:00) [2]


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


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


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


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


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


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


KitsumVI   (2005-11-22 17:13:00) [3]


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

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

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

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


tesseract   (2005-11-21 18:12:00) [4]


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

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

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

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


evvcom   (2005-11-21 15:24:00) [5]


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

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


tesseract   (2005-11-21 10:22:00) [6]


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


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


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


Tlist.


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


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


Anatoly Podgoretsky   (2005-11-21 09:36:00) [7]

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


KitsumVI   (2005-11-21 09:29:00) [8]

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


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

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;


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


ЮЮ   (2005-11-21 08:52:00) [10]

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


Наверх

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