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

Interface 无法从接口基本列表中识别最终接口实现,interface,d,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() {

如何在当前接口中实现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实现者可能会被降级为一个bar(因此在bar中创建一个虚拟的final method1是不可能的)。

接口只能声明没有实现的虚拟成员,或者声明有实现的最终成员。您的代码试图用非虚拟实现重写虚拟方法。由于接口的性质,您实际上无法覆盖接口中的任何内容。您需要的是一个抽象类

abstract class baz: bar!int
{
    override void method1(int a){}
}
用上述类替换
baz
接口将解决此问题

作为为什么不允许这样的一个例子,考虑这个代码:(当然不编译)< /P>


(新C()).foo()将返回什么?结果是模棱两可的。重写类中的接口方法是可以接受的,因为与接口不同,一次只能继承一个类。

接口只能声明未实现的虚拟成员,或声明具有实现的最终成员。您的代码试图用非虚拟实现重写虚拟方法。由于接口的性质,您实际上无法覆盖接口中的任何内容。您需要的是一个抽象类

abstract class baz: bar!int
{
    override void method1(int a){}
}
用上述类替换
baz
接口将解决此问题

作为为什么不允许这样的一个例子,考虑这个代码:(当然不编译)< /P>


(新C()).foo()将返回什么?结果是模棱两可的。只能重写类中的接口方法,因为与接口不同,您一次只能继承一个类。

重写
添加到重写基类方法的方法中,然后我得到
错误:函数SpecItf.baz.method1无法重写非虚拟函数
bar.method1不被视为虚拟方法?模板化方法通常不是“tmethod1()不是模板方法,是吗?“酒吧”本身就是一个模板,但酒吧!int.method1()不是.POO/TMP mess…这里有些不太清楚。将
覆盖
添加到覆盖基类方法的方法中,然后我得到
错误:函数SpecItf.baz.method1不能覆盖非虚拟函数
bar.method1不被视为虚拟方法?模板化方法通常是'tmethod1()不是一个模板方法,是吗?“酒吧”本身就是一个模板,但酒吧!int.method1()不是。POO/TMP混乱…这里有些不太清楚。啊,我看到了钻石问题啊,我看到了钻石问题