долго думал как правильно выразиться и таки выразился неправильно.
Имел в виду более поздние версии (к сожалению не в курсе были ли такие в природе).
Спасибо, 3-й сам нашел.
B>как быть с объявлением parent, который сейчас TStorage?
если TStorage выносить в отдельный модуль, то парент придётся объявить нейтрально например как TObject, а во всех функциях работающих с парентом использовать кастинг, так все делают
Re[2]: Как спроектировать объект, содержащий списки?
Здравствуйте, __Azeroth, Вы писали:
B>>как быть с объявлением parent, который сейчас TStorage? __A>если TStorage выносить в отдельный модуль, то парент придётся объявить нейтрально например как TObject, а во всех функциях работающих с парентом использовать кастинг, так все делают
я сам до этого почти догадался, придумал такое решение: Создать абстрактный класс TStorageInterface,базовый для TStorage и находящийся в отдельном файле. Использовать так же как предлагаемый TObject.
IMHO:
+ не запутаеmься в TObject'aх и касты не надо делать.
— еще один файл и класс.
Re[2]: Как спроектировать объект, содержащий списки?
Здравствуйте, boriskr, Вы писали:
B>Пишу в Kylix. B>Есть несколько типов списков, они наследуют от базового класса TBaseList примерно так: B>
B>type
B> TStorage=class; // опережающее определение
B> TList1=class(TBaseList)
B> public
B> parent:TStorage;
B> ... // тут функции которые работают со Storage
B> end;
B>
B>И есть объект, содержащий несколько таких списков: B>
B>Все это работает, если находится в одном pas файле, а я хочу разделить TStorage и списки... тогда опережающее определение не работает!
B>как быть с объявлением parent, который сейчас TStorage?
Интерфейсы спасут отца русской демократии.
Re[2]: Как спроектировать объект, содержащий списки?
Здравствуйте, __Azeroth, Вы писали:
B>>как быть с объявлением parent, который сейчас TStorage? __A>если TStorage выносить в отдельный модуль, то парент придётся объявить нейтрально например как TObject, а во всех функциях работающих с парентом использовать кастинг, так все делают
Лучше какой-нибудь TAbstractStorage. Чтоб без кастингов.
Здравствуйте, boriskr, Вы писали:
B>Пишу в Kylix. B>Есть несколько типов списков, они наследуют от базового класса TBaseList примерно так: B>
B>type
B> TStorage=class; // опережающее определение
B> TList1=class(TBaseList)
B> public
B> parent:TStorage;
B> ... // тут функции которые работают со Storage
B> end;
B>
B>И есть объект, содержащий несколько таких списков: B>
B>Все это работает, если находится в одном pas файле, а я хочу разделить TStorage и списки... тогда опережающее определение не работает!
B>как быть с объявлением parent, который сейчас TStorage?
Посмотри в исходниках VCL, как это сам борланд сделал.
Поиск по слову Hack. Например ClxEditors.pas
Как улитка с параличем мчится мысль неудержимо, центр речи возбуждая
Re[2]: Как спроектировать объект, содержащий списки?
Здравствуйте, SnowBlast, Вы писали:
SB>Посмотри в исходниках VCL, как это сам борланд сделал. SB>Поиск по слову Hack. Например ClxEditors.pas
Я не понял, зачем они там перед функцией CreateAction объявляют
type
THackAction = class(TCustomAction);
и потом делают
THackAction(Result).FMask.Free;
если можно сразу
TCustomAction(Result).FMask.Free;
Re[3]: Как спроектировать объект, содержащий списки?
Здравствуйте, boriskr, Вы писали:
B>Здравствуйте, SnowBlast, Вы писали:
SB>>Посмотри в исходниках VCL, как это сам борланд сделал. SB>>Поиск по слову Hack. Например ClxEditors.pas B>Я не понял, зачем они там перед функцией CreateAction объявляют B>
type
B> THackAction = class(TCustomAction);
B>
B>и потом делают B>
THackAction(Result).FMask.Free;
B>если можно сразу B>
TCustomAction(Result).FMask.Free;
ПАтАму чтА в Object Pascal доступ к protected полям разрешается всем класам и методам юнита в котором клас задекларирован. Тоесть THackAction в этом юните значит доступ будет открыт. А вот TCustomAction задекларирован совсем в другом месте, значит к protected полям мы не доступимся.