[fpc-pascal] 2.1.1 new protected
Michael Van Canneyt
michael at freepascal.org
Fri Aug 11 13:59:12 CEST 2006
On Fri, 11 Aug 2006, Florian Klaempfl wrote:
> Michael Van Canneyt wrote:
>>
>>
>> On Fri, 11 Aug 2006, Florian Klaempfl wrote:
>>
>>> Mattias Gaertner wrote:
>>>> Recently the behaviour of the 'protected' keyword has changed in fpc
>>>> 2.1.1.
>>>> Now I wonder how can I fix the code, that depends on this.
>>>
>>> Redesign :)
>>>
>>>>
>>>> I have some base classes, that defines methods to let derived classes
>>>> interact.
>>>> These methods should not be accessed directly from the outside, so they
>>>> are protected. But this does not work any longer. Of course I can safely
>>>> typecast, but for aesthetic reasons it looks pretty bad coding style to
>>>> typecast a class to the wrong class. For example:
>>>>
>>>> -- unit1 -------------------------
>>>> TMyClass = class
>>>> FFlag: boolean;
>>>> protected
>>>> procedure InternalSetFlag(b: boolean);
>>>> end;
>>>>
>>>> -- unit2 -------------------------
>>>> TDescendantClass1 = class(TMyClass)
>>>> public
>>>> procedure CallProtectedMethod(AnObject: TMyClass);
>>>> end;
>>>>
>>>> TDescendantClass2 = class(TMyClass)
>>>> end;
>>>>
>>>> procedure TDescendantClass1.CallProtectedMethod(AnObject: TMyClass);
>>>> begin
>>>> InternalSetFlag(true); // allowed
>>>> AnObject.InternalSetFlag(true); // not allowed any longer
>>>> TDescendantClass1(AnObject).InternalSetFlag(true); // allowed and
>>>> works, but ugly
>>>
>>>
>>> Shouldn't be allowed either imo.
>>
>> Why not ? In a descendent class you 'know' the protected method.
>
> But only of the current instance, no?
Well, nothing is said about this in the manuals; For me this is up to discussion.
It seems normal to me that it is not just the current instance. You KNOW this
method is there, in a descendent, so it seems logical that you know that it
exists for another instance as well.
Personally, I think we should allow use of protected methods in a descendent,
also for other instances. In the above example:
AnObject.InternalSetFlag(true);
Should work. But since this is not Delphi compatible, I think this should be
in Objpas mode only.
Michael.
More information about the fpc-pascal
mailing list