3

有什么方法可以覆盖子类中的 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 有好处?)

4

2 回答 2

6

成员模板函数不能是虚拟的,因此不能被覆盖。

http://dlang.org/function.html#virtual-functions

opDispatch 是模板化函数。这两个调用是相同的:

s.callingOpDispatch();
s.opDispatch!("callingOpDispatch")()
于 2013-08-13T13:21:05.793 回答
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 并使其工作。

于 2013-08-13T13:31:59.480 回答