Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.032 c
2-1132414523
Venum
2005-11-19 18:35
2005.12.11
TWebBrowser


14-1132559785
Игорь Шевченко
2005-11-21 10:56
2005.12.11
Откуда растут руки у русских программистов ?


14-1132192872
SPeller
2005-11-17 05:01
2005.12.11
Вторая мировая и роль США в ней


3-1129540419
Zhekson
2005-10-17 13:13
2005.12.11
Установка BDE


2-1132818133
VadimSpb
2005-11-24 10:42
2005.12.11
Проблема запроса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский