Текущий архив: 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.48 MB
Время: 0.037 c