[fpc-pascal] 2.1.1 new protected

Michael Van Canneyt michael at freepascal.org
Fri Aug 11 13:51:40 CEST 2006



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.

Michael.



More information about the fpc-pascal mailing list