3

サブクラスで opDispatch をオーバーライドする方法はありますか? 私が実際にやりたいことは、スーパークラスを静的型として変数を渡すことですが、これにより、opDispatch への呼び出しがそのサブ型 (動的型) にリダイレクトされます。

基本的に、このコードで「Super」ではなく「Sub」を出力したいのです。

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

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 はテンプレートではないことに注意してください。現在は名前を通常のランタイム パラメータとして渡しているため、パフォーマンスが重要な場合は注意してください。

ただし、サブクラスで opDispatchImpl をオーバーライドして機能させることができます。

于 2013-08-13T13:31:59.480 に答える