[fpc-pascal] 2.1.1 new protected
Alexandre Leclerc
alexandre.leclerc at gmail.com
Fri Aug 11 15:26:32 CEST 2006
2006/8/11, Mattias Gaertner <nc-gaertnma at netcologne.de>:
> On Fri, 11 Aug 2006 14:49:16 +0200
> "Graeme Geldenhuys" <graemeg.lists at gmail.com> wrote:
>
> > On 8/11/06, Michael Van Canneyt <michael at freepascal.org> wrote:
> > > 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.
> >
> > Coming from a Delphi background, I disagree here. As I understood the
> > Delphi docs, protected methods are only visible in the current
> > instance (decendant), and not instances passed in as parameters.
>
> It does not matter how you got the instance, via parameter, variable or function.
> Only the class of the instance matters.
>
> The screenshot says:
> A protected member is visible [...] from any descendant class.
> A protected method can be called from the definition of any method belonging to a class that descends from the one where the protected member is declared.
>
> Where do you read here anything about 'current instance'?
>
> IMO the old 'Protected' was very easy to explain to people:
> "Is the same as Private, except that the members of a Protected section are also accessible to descendent types, even if they are implemented in other modules."
> No exceptions. Pretty straight.
Yep this is it and I always understood it like that.
> And it was very Delphi compatible. I mean, how many Delphians noticed the difference at all? It didn't hurt and gave more flexibility. So, I second Michael's proposal to at least keep it in mode objfpc.
I would make it work if you are actually in a descendent...? Because
for me typecasting AnObject to make it fit with a descendent and using
the protected method is a violation of the rule. If you are in a
descendent then you can call the protected method. Then a typecast
would not be required either sing you know the descendent.
So your initial example is acceptable. Here a note/comment I add and a
unit3 example to explain the simple point I raised.
-- unit2 -------------------------
procedure TDescendantClass1.CallProtectedMethod(AnObject: TMyClass);
begin
InternalSetFlag(true); // allowed
AnObject.InternalSetFlag(true); // allowed (why not?), you know the descendent?
TDescendantClass1(AnObject).InternalSetFlag(true); // allowed and
works, but ugly
end;
-- unit3 -------------------------
ADescendantClass1 = TDescendantClass1;
ADescendantClass2 = TDescendantClass2;
procedure Form1.TryAccessProtected(AnObject: TMyClass);
begin
AnObject.InternalSetFlag(true); // not allowed
TDescendantClass1(AnObject).InternalSetFlag(true); // not allowed
end;
-------------------------------
Best Regards.
--
Alexandre Leclerc
More information about the fpc-pascal
mailing list