[M3devel] calling an overridden method
Hendrik Boom
hendrik at topoi.pooq.com
Tue Jul 19 19:40:04 CEST 2011
On Tue, Jul 19, 2011 at 01:26:14PM -0400, Hendrik Boom wrote:
> On Tue, Jul 19, 2011 at 07:11:05AM -0700, Mika Nystrom wrote:
> > Sorry I'm being confusing here.
> >
> > The code is right but I think your question is a bit confusing.
> >
> > With your init example I don't think you're talking about an overridden
> > init method but a shadowed method.
>
> A 'shadowed' method. Is that what you call what's essentially a new
> method that happens to have the same name? Just like the way a variable
> in a nested block that has the same name as one in an outer block would
> be a new variable (I'm not sure Modula 3 allows this, the way C and the
> Algols do; I find it leads to confusing code).
>
> Init is the one I've seen explained in documentation. It's not what I
> want, because that trick provides no inheritance.
>
> > You can't call an overridden method
> > through the widening trick, but you *can* call a shadowed method like
> > that.
> >
> > Mika
> >
> > Mika Nystrom writes:
> > >
> > >TYPE A = OBJECT METHODS m(xxx) END;
> > >
> > >TYPE B = A OBJECT METHODS m(xxx) END;
>
> This is, if I understand the terminology, a declaratin of m as a shadowd
> method. It's not what I want, because I intend that under normal
> circumstances, if an B object is used in a context where its static type
> is known as A, I still want the normal overriding mechanism to ensure
> that B's m is the one called.
>
> I mean something like
>
> TYPE B = A OBJECT OVERRIDES m := ... END;
>
> > >
> > >b := NEW(B);
> > >
> > >A.m(b,xxx)
>
> So this is a way to specifically get the m that belongs with A? Will
> this work with the way I want to define B and m?
>
> as in
>
> TYPE A = OBJECT METHODS m(xxx) := bar END;
>
> TYPE B = A OBJECT OVERRIDES m := foo END;
>
> PROCEDURE foo(self : B, ....) =
> BEGIN
> ...
> ...
> A.m(self, ...) (* and this ends up calling bar? *)
> ...
> END foo;
Well. I tried my version, and it works. Thanks for the advice.
-- hendrik
>
> > >
> > > Mika
> > >
> > >Hendrik Boom writes:
> > >>I have a module containing a parent class, and another containing a
> > >>child class.
> > >>
> > >>The parent class contains a method 'foo', which is to be overridden in
> > >>the child class.
> > >>
> > >>But in implementing 'foo' in the child class I want to call the parent's
> > >>method.
> > >>
> > >>Now with the method 'init' there's a trick where in the child's init,
> > >>you WIDEN self to the parent's type and then call its init.
> > >>This works because 'init' isn't overridden in an OVERRIDES clause,
> > >>but is defined as a new method that happens to have the same name.
> > >>
> > >>Is there any way to do this with 'foo', where the whole point is that
> > >>it be an overridden method and not a new one?
> > >>
> > >>Do I have to do something like covertly exporting the PROCEDURE that
> > >>implements 'foo' in the parent's module so that it can be called
> > >>directly? That would seem to be a violation of modular design. Or is
> > >>violating modular design exactly what I'm really trying to do here?
> > >>
> > >>-- hendrik
More information about the M3devel
mailing list