reimplementing an interface in a derived class

Ali Çehreli acehreli at yahoo.com
Fri Jan 4 21:08:24 UTC 2019


On 01/04/2019 12:46 AM, Alex wrote:
 > On Friday, 4 January 2019 at 07:37:43 UTC, bauss wrote:
 >> No, because you OVERRIDE A's foo().
 >>
 >> A does not exist. A is B and when you cast B to A you just tell the
 >> compiler that the reference should only have A's signature available.
 >>
 >> You're not assigning B to A.
 >
 > Let's assume this is right. How to force a B object to behave like an A
 > object?

Not possible by default. However, a B object is already behaving like an 
A object because e.g. it overrides the foo() member function.

 > I thought casting is a possible approach...

In this case, casting is using the B object through it's A interface. 
The overridden behavior does not change. (Actually, that is possible in 
languages that support multiple inheritance through multiple virtual 
function pointer tables (vtbl) but D does not support that.)

Although I'm getting into implementation details here, I think it helps 
with understanding the semantics. There is only one vtbl per class 
object in D and the function entries are all filled in during 
construction. So, a B object's 'foo' slot in that table is filled with 
B.foo. So, such an object can foo() only as a B.

If there is such a need and B can indeed support behaving like an A, it 
can do so itself by calling A.foo, not through vtbl, but directly:

class B : A {
   override void foo() {
     A.foo();  // Calling directly
   }
}

By the way, do you have a use case in mind? Perhaps there are other ways 
to achieve that.

Ali



More information about the Digitalmars-d-learn mailing list