无法从接口基本列表中识别最终接口实现

时间:2014-05-21 15:42:55

标签: interface d

如何在当前界面中实现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)。

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()会返回什么?结果是模棱两可的。覆盖类中的接口方法是可以接受的,因为与接口不同,您一次只能继承一个类。