有没有办法指定要覆盖哪个函数?

Is there a way to specify which function to override?

interface A
{
    void f();
}
interface B
{
    void f();
}
class C : A ,B
{
// pseudocode 
    void A::a(){}
    void B::a(){}
}

有没有办法在同一个 class 中实现 A::fB::f 的不同实现?

当他们都有相同的签名时,不*。如果 A.fvoid f() 并且 B.fint f(),这是可能的。

* 实际上,有一种方法,如果你承认它做的不是完全一样的事情:

interface A { string f(); }

interface B { string f(); }

class C : A {
    string f() { return "A"; }
    string bf() { return "B"; }
    
    // Pretend to be a B
    alias get this;
    B get() {
        auto that = this;
        return new class B {
            string f() { return that.bf(); }
        };
    }
}

unittest {
    auto c = new C();
    
    A a = c;
    B b = c;
    
    assert(a.f() == "A");
    assert(b.f() == "B");
}

在上面的代码中,我们使用 alias this 创建了一种第二继承链。这有一些问题,最大的问题是我们不能从 get() 返回的东西转换回 C

这可以通过 UDA 和 mixin 变得更通用,这样它应该可以编译并且 运行:

interface A { string f(); }
interface B { string f(); }
interface C { string f(); }
@implements!(B, C)
class D : A {
    string f() { return "A"; }
    @implements!(B.f)
    string bf() { return "B"; }
    @implements!(C.f)
    string cf() { return "C"; }
    mixin implement!();
}

unittest {
    D d = new D();
    A a = d;
    B b = d;
    C c = d;

    assert(a.f() == "A");
    assert(b.f() == "B");
    assert(c.f() == "C");

    assert(a == cast(A)d);
    assert(b == cast(B)d);
    assert(c == cast(C)d);
}

不过,那是 reader 的练习。