Multiple opCall's

Jonathan M Davis jmdavisProg at gmx.com
Mon Feb 21 04:17:06 PST 2011


On Monday 21 February 2011 02:47:03 Mafi wrote:
> Am 21.02.2011 11:18, schrieb useo:
> > Hey guys,
> > 
> > I've a small problem implementing multiple opCall()-methods. At first,
> > I've the following interface:
> > 
> > interface Invoker {
> > 
> >   void opCall(uint i);
> > 
> > }
> > 
> > ... and an abstract class which inherits from the Invoker-interface like
> > the following:
> > 
> > abstract class AbstractInvoker : Invoker {
> > 
> >   private int myInt;
> >   
> >   override void opCall(uint i) { /** do nothing */ }
> 
> In an abstract class you can just leave this out. The inheriting class
> will then be checked to implement this.
> 
> >   void opCall() {
> >   
> >    opCall(myInt);
> >   
> >   }
> > 
> > }
> > 
> > I know... I can remove the opCall(uint i) from the interface, but it's
> > needed for some other classes which implements this method. For those
> > classes the opCall(uint i)-method is needed.
> > 
> > But... when I now declare a class like this:
> > 
> > class InvokableClass : AbstractInvoker {
> > 
> >   override void opCall(uint i) {
> >   
> >    // do something
> >   
> >   }
> > 
> > }
> > 
> > and do the following:
> > 
> > void main(string[] args) {
> > 
> >   InvokableClass() ic = new InvokeableClass();
> >   ic();
> > 
> > }
> > 
> > I always get the following errors:
> > 
> > Error: function InvokableClass.opCall (uint i) is not callable using
> > argument types (). Error: expected 1 function arguments, not 0
> > 
> > But I think opCall() is implemented in the abstract class and should be
> > callable using opCall() instead using opCall(uint i)?
> 
> Overriding one opCall shadows all other opCalls inherited from the base
> class. This behaviour is like with any method. Write:
> 
> override void opCall() {
> 	super.opCall();
> }
> 
> to forward to the base class method.
> AFAIK it's an anti-hijacking machanism.

Or you can use alias. Inside of Invokable class, put

alias AbstractInvokableClass.opCall opCall;

That should put all of AbstractInvokableClass' in the overload set for 
InvokableClass.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list