Вниз
Скачать: CL | DM;

Доступ к списку (private) класса TA из класса TB содержащего TA   Найти похожие ветки 

← →
cross   (2010-12-08 12:32) [0]

условно есть 2 класса (TA и TB). Класс TB содержит в себе объект TA.

TA = class(TObject)
 private
   { ... }
   FPacks: TList<TZIPForge>;
 public
   { ... }
   // ?
 end;

 TB = class(TObject)
 private
   { ... }
   FA: TA;
 public
   { ... }
   procedure fill_needed(APacks: TList<TZIPForge>); // <- сюда должен передоваться список TA.FPacks.
end;


Из класса TB мне нужно иметь возможность работать со списком TA.FPacks (он private). Как обычно поступают в таких случаях:

1. Сделать property Packs: TList<TZIPForge> read get_packs;

2. Сделать property Packs[Idx: Integer]: TZIPForge read get_pack;
               propety packs_count: Integer read get_packs_count;


← →
Медвежонок ХМЛ ©   (2010-12-08 12:48) [1]

В таких случаях обычно поступают так, что бы подобных вопросов в принципе не возникало.
Иными словами проектируют классы более адекватно.

Ну или по крайней мере не стоят так долго в раздумьях между двух копен сена 1. и 2. (там есть большая разница?)


← →
Servy ©   (2010-12-08 12:56) [2]


> там есть большая разница?


Есть, если TList наружу торчит, то в него вражина и понадобавлять может чего, или поудалять. А так не выйдет у него. В зависимости от того (нужно ли строго не давать никому снаружи добавлять в TList, или удалять из него егошными методами) и зависит ответ.

Я бы оставил TList, тут тебе и Enumerator готовый, и процедура добавления/удаления. А так придется свои прослойки писать. Впрочем, бывают случаи, когда такие прослойки оправданы.


← →
И. Павел ©   (2010-12-08 12:58) [3]

> то в него вражина и понадобавлять может чего, или поудалять.

Ну, вражина он и индийским способом пролезет:

TFriendControl = class(TA);
TFriendControl(TA).FPacks


← →
RWolf ©   (2010-12-08 12:59) [4]

В случае 1) класс TB может дополнить список, удалить из списка элементы и т.п. В случае 2) эти операции запрещены.
Кстати, приватные поля классов видны в пределах модуля, так что, если TA и TB расположены в одном модуле, можно обойтись без свойств.


← →
Servy ©   (2010-12-08 13:03) [5]


> Ну, вражина он и индийским способом пролезет:


Главное, что у нас грабли на крылечке не лежат, на радость менее опытным программистам. А уж если он сейф вскрывает, чтоб на грабли наступить - вероятно сей индеец знает, что делает.


← →
icWasya ©   (2010-12-08 13:27) [6]

Вроде бы если классы находятся в одном модуле, то имеют  возможность напрямую обращаться к привантым данным друг друга.
Или в старших версиях Delphi это уже не так?


← →
Ega23 ©   (2010-12-08 13:34) [7]


> Или в старших версиях Delphi это уже не так?


В "старших" версиях появилась директива strict private


← →
_Юрий   (2010-12-08 19:27) [8]

Я в таких случаях делаю так
protected
property Packs: TList<TZIPForge> read FPacks


← →
Ega23 ©   (2010-12-08 21:21) [9]


>
> Ну, вражина он и индийским способом пролезет:
>
> TFriendControl = class(TA);
> TFriendControl(TA).FPacks


Если FPacks - private, то пролезет только в рамках данного юнита.



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.005 c
2-1291306769
Чайник
2010-12-02 19:19
2011.02.27
Вставка в TStringGrid через буфер обмена


15-1289990564
alexdn_
2010-11-17 13:42
2011.02.27
Майкрософт, конференция, платформа 2011


15-1289770190
Юрий
2010-11-15 00:29
2011.02.27
С днем рождения ! 15 ноября 2010 понедельник


2-1290769217
dm
2010-11-26 14:00
2011.02.27
изменение ip адреса шлюза и пр


15-1290100289
Mitroshin
2010-11-18 20:11
2011.02.27
Несколько вопросов по переходу с D7 на D2010 (литература)




   Наверх