有没有办法在子类中覆盖opDispatch? 我真正想做的是传递一个以超类作为静态类型的变量,但是将对opDispatch的调用重定向到它的子类型(动态类型)。
基本上,我希望此代码打印“Sub”而不是“Super”。
import std.stdio;
class Super
{
void opDispatch(string m)()
{
writeln("Super");
}
}
class Sub : Super
{
override void opDispatch(string m)()
{
writeln("Sub");
}
}
void main()
{
Super s = new Sub();
s.callingOpDispatch; // Writes "Super" instead of "Sub"
}
我傻眼了,因为我无法通过使用抽象方法强制编译器查找方法覆盖(D不允许抽象模板化方法)。
PS:有人可以创建标签opDispatch吗? (在我看来这对D会有好处吗?)
答案 0 :(得分:6)
成员模板功能不能是虚拟的,因此无法覆盖。
http://dlang.org/function.html#virtual-functions
opDispatch是模板化功能。这两个电话是相同的:
s.callingOpDispatch();
s.opDispatch!("callingOpDispatch")()
答案 1 :(得分:3)
像Michal所说,模板不能是虚拟的,所以你要做的就是将模板转发给另一个函数:
import std.stdio;
class Super
{
public final void opDispatch(string m)()
{
opDispatchImpl(m);
}
protected void opDispatchImpl(string m) {
writeln("Super");
}
}
class Sub : Super
{
protected override void opDispatchImpl(string m)
{
writeln("Sub");
}
}
void main()
{
Super s = new Sub();
s.callingOpDispatch; // Writes "Sub" now
}
请注意,impl不是模板,它现在将name作为常规运行时参数传递,因此如果性能很重要,请注意这一点。
但是你可以在子类中覆盖opDispatchImpl并使其工作。