http://d.puremagic.com/issues/show_bug.cgi?id=2050
------- Comment #11 from and...@metalanguage.com 2009-04-04 10:58 ------- (In reply to comment #9) > (In reply to comment #0) > This seems to break composability: > > interface I1 { final int foo() {return 1;} } > interface I2 { final int foo() {return 2;} } > > class A: I1, I2 {} > > Whose foo does A choose? And how is it resolved? (given you can't drop one of > the interfaces). I think that's an ambiguity. It might be busted by having A write e.g. alias I1.foo foo; > And consider > > class B: I1, I2 { final int foo() {return 3;} } > B b = new B(); > I1 i1 = b; > I2 i2 = b; > assert( i1.foo == 1 ); > assert( i2.foo == 2 ); > assert( b.foo == 3 ); A good use of final functions is to enable the non-virtual interface idiom. The point of that idiom is partially that you cannot override final functions in interfaces. --