如何在当前界面中实现InterfaceBaseList中的方法?例如:
interface bar(T)
{
void method1(T a);
void method2(T a);
}
interface baz: bar!int
{
final void method1(int a){}
}
class foo: baz
{
this(){method1(0);}
void method2(int a){}
}
void main()
{
auto Foo = new foo;
Foo.method2(0);
}
输出:
myfile.d(xx): Error: foo interface function 'void method1(int a)'
is not implemented
似乎编译器没有得到baz.method1
实际上是bar.method1
。
请注意,该示例说明了在baz中,由于某些原因,我们知道method1将始终具有相同的实现。 baz实现者可以将其作为一个条形图(因此无法在条形图中创建一个虚拟的最终方法1)。
答案 0 :(得分:4)
接口只能在没有实现的情况下声明虚拟成员,或者在具有实现的最终成员中声明。您的代码正在尝试使用非虚拟实现覆盖虚拟方法。由于接口的性质,您实际上无法覆盖其中的任何内容。你想要的是一个抽象类。
abstract class baz: bar!int
{
override void method1(int a){}
}
用上述课程替换baz
界面将解决问题。
作为为什么不允许这样做的一个例子,请考虑以下代码:(当然不编译!)
interface Root {
int foo();
}
interface BranchA : Root {
override int foo() { return 1; }
}
interface BranchB : Root {
override int foo() { return 2; }
}
class C : BranchA, BranchB { }
(new C()).foo()
会返回什么?结果是模棱两可的。覆盖类中的接口方法是可以接受的,因为与接口不同,您一次只能继承一个类。