![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Композитивный класс [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, там приведен целый список наследников. Присоединяйся!