Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.27;
Скачать: 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 вся ветка

Текущий архив: 2011.02.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
2-1291286404
Анна
2010-12-02 13:40
2011.02.27
печать данных в Excel


15-1289472401
hattak
2010-11-11 13:46
2011.02.27
PlugIn для Internet Explorer


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


15-1290029388
Юрий
2010-11-18 00:29
2011.02.27
С днем рождения ! 18 ноября 2010 четверг


10-1170751259
Juice
2007-02-06 11:40
2011.02.27
Как заставить нормально работать Early Binding?