On Thursday 06 May 2010 02:45:35 Hans-Peter Diettrich wrote: > In any case the > encapsulation of class fields and methods is broken; this encapsulation > was designed for an interface between the component library and > application code, not for code transformation, GUI designers or other > "low level" stuff. > I have this problem every day in development of MSEgui framework. Often there is need to access low level stuff in classes which are defined in other units. I don't want to define the low level stuff public because it should not be used in application code. I don't want to use a single unit for the whole framework because there are about 200'000 lines, I don't like include files, for the compiler it would be a single unit anyway. And please don't suggest I should refactor the code in order to have no low level interactions between framework classes in different units. ;-) It is simply not possible, especially in a framework which evolves over a long time and where it is too dangerous and expensive to change the architecture often for additions which where not foreseen at the beginning.
Because of this I supposed several times the introduction of the simple construct of "friend units" where protected class members are visible. Nobody liked it :-( so MSEgui is full of code like: " uses classes,mseclasses,msegui; type twidget1 = class(twidget); tcustomframe1 = class(tcustomframe); [...] twidget1(thewidget).dosomething(); tcustomframe1(frame).dosomeother(); " With "friend units" it could be done for example like: " uses classes,mseclasses; friends //or any other more appropriate identifier msegui; [...] thewidget.dosomething(); frame.dosomeother(); " Public framework class elements are intended to be used by application code, protected elements in "friend units" can be used too but need a deeper knowledge of the context and are normally accessible by the framework only, private elements are for encapsulation purpose. Martin -- _______________________________________________ Lazarus mailing list [email protected] http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
