有没有办法指定要覆盖哪个函数?
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::f
和 B::f
的不同实现?
当他们都有相同的签名时,不*。如果 A.f
是 void f()
并且 B.f
是 int 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 的练习。
interface A
{
void f();
}
interface B
{
void f();
}
class C : A ,B
{
// pseudocode
void A::a(){}
void B::a(){}
}
有没有办法在同一个 class 中实现 A::f
和 B::f
的不同实现?
当他们都有相同的签名时,不*。如果 A.f
是 void f()
并且 B.f
是 int 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 的练习。