www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Satisfying interface requirements

reply Jason House <jason.james.house gmail.com> writes:
Content-Type: text/plain

Attached is a simple example that demonstrates my problem (with dmd 1.018).  It
seems like inheriting from a class that contains functions that would satisfy
an interface does not work.  Usually, I work around this by just adding a
manual call to super's copy.  Unfortunately, this only works if super's member
function is not final.  Any tips on how to work around this?

If line 7 is commented out:
test.d(6): class test.foo interface function bar.start is not implemented

If line 7 is present:
test.d(7): function test.foo.start cannot override final function
tango.core.Thread.Thread.start
Jul 26 2007
next sibling parent reply Chris Nicholson-Sauls <ibisbasenji gmail.com> writes:
Jason House wrote:
 Attached is a simple example that demonstrates my problem (with dmd 1.018). 
It seems like inheriting from a class that contains functions that would
satisfy an interface does not work.  Usually, I work around this by just adding
a manual call to super's copy.  Unfortunately, this only works if super's
member function is not final.  Any tips on how to work around this?
 
 If line 7 is commented out:
 test.d(6): class test.foo interface function bar.start is not implemented
 
 If line 7 is present:
 test.d(7): function test.foo.start cannot override final function
tango.core.Thread.Thread.start

The standard technique is to use an alias, like so: interface Foo { int bar(); } class A { int bar(); } class B : A, Foo { alias A.bar bar; } Although, personally, I'm not entirely satisfied with this. I would think checking for interface implementation warrants a look up the inheritance chain. I think there was a reason given in an older discussion, but darned if I can remember it now. -- Chris Nicholson-Sauls
Jul 26 2007
parent reply Jason House <jason.james.house gmail.com> writes:
Chris Nicholson-Sauls wrote:
 Jason House wrote:
 Attached is a simple example that demonstrates my problem (with dmd 
 1.018).  It seems like inheriting from a class that contains functions 
 that would satisfy an interface does not work.  Usually, I work around 
 this by just adding a manual call to super's copy.  Unfortunately, 
 this only works if super's member function is not final.  Any tips on 
 how to work around this?

 If line 7 is commented out:
 test.d(6): class test.foo interface function bar.start is not implemented

 If line 7 is present:
 test.d(7): function test.foo.start cannot override final function 
 tango.core.Thread.Thread.start

The standard technique is to use an alias, like so: interface Foo { int bar(); } class A { int bar(); } class B : A, Foo { alias A.bar bar; } Although, personally, I'm not entirely satisfied with this. I would think checking for interface implementation warrants a look up the inheritance chain. I think there was a reason given in an older discussion, but darned if I can remember it now. -- Chris Nicholson-Sauls

For whatever reason, that trick didn't work for me. I got the same error as if I hadn't had the alias in there at all.
Jul 26 2007
parent BCS <ao pathlink.com> writes:
Reply to Jason,

 For whatever reason, that trick didn't work for me.  I got the same
 error as if I hadn't had the alias in there at all.
 

could you post code? what version are you using?
Jul 27 2007
prev sibling parent BCS <ao pathlink.com> writes:
Reply to Jason,

 Attached is a simple example that demonstrates my problem (with dmd
 1.018).  It seems like inheriting from a class that contains functions
 that would satisfy an interface does not work.  Usually, I work around
 this by just adding a manual call to super's copy.  Unfortunately,
 this only works if super's member function is not final.  Any tips on
 how to work around this?
 
 If line 7 is commented out:
 test.d(6): class test.foo interface function bar.start is not
 implemented
 If line 7 is present:
 test.d(7): function test.foo.start cannot override final function
 tango.core.Thread.Thread.start

alias the functions (I think you can even change the name to make it match) interface I {int foo();} class C { int bar(){...} } class D : C, I {alias bar foo;}
Jul 26 2007