17

私は今日までこの問題に遭遇したことがなく、この種の行動を達成するための慣習/ベストプラクティスは何であるか疑問に思っていました。

基本的なセットアップは次のとおりです。

public interface IDispatch {
    void Dispatch();
}

public class Foo : IDispatch {
    void IDispatch.Dispatch() {
        DoSomething();
    }
}

public class Bar : Foo {
     ...
}

BarはFooをサブクラス化する必要があります。これは、Barと同じプロパティをすべて共有し、さらに2つの新しいプロパティを導入するためです。私が抱えている問題は、FooにもDispatch()のわずかに異なる実装が必要なことです。通常はオーバーライドされますが、これはインターフェイスメソッドには無効なので、BarにIDispatchを実装させるだけでも問題ないので、クラス定義は次のようになります。

public class Bar : Foo, IDispatch { .... }

次に、Barでもそのインターフェイスメソッドを明示的に実装しますか?私のコンパイラは、この方法でそれを行おうとすると文句を言わないようですが、それが将来どの実装を使用するかを解決するランタイムの問題を引き起こすかどうか、またはこのようなことを達成するためのより良い方法があるかどうかはわかりませんでした。

また、私の職場では、UMLモデルからのコード生成を使用しているため、すべてのクラス設計を最初にモデルから実行する必要があります。コード生成ツールは、インターフェイスメソッドを明示的に実装する原因になります(これの長所と短所については、今私が対処しなければならないことなので、暗黙的な実装はオプションではありません)

4

5 に答える 5

18

または、次の 2 つの方法のいずれかを実行できます。

まず、インターフェイスを明示的に実装しないでください。

public class Foo : IDispatch {
    public virtual void Dispatch() {
        whatever();
    }
}

public class Bar : Foo {
    public override void Dispatch() {
        whateverElse();
    }
}

次に、明示的に実装しますが、子クラスがオーバーライドできる関数を追加します。

public class Foo : IDispatch {
    void IDispatch.Dispatch() {
        this.Dispatch();
    }

    protected virtual void Dispatch() {
        whatever();
    }
}

public class Bar : Foo {
    protected override void Dispatch() {
        whateverElse();
    }
}
于 2012-11-22T16:00:04.110 に答える
13

はい、 を実装することを明示的に再宣言しIDispatch、 で再度明示的に実装できますBar

ただし、 で元の実装を呼び出すことはできませんFoo。それを行う必要がある場合は、Foo暗黙的なインターフェイス実装を仮想メソッド (オーバーライドしてbase.Dispatch()in で呼び出すことができますBar) で使用するか、Foo実装で保護された仮想メソッドを呼び出すように変更する必要があります。 Bar.

于 2012-11-22T15:59:15.050 に答える
2

実行する必要はありません- 呼び出されたメソッドがクラス内にIDispatch.Dispatchある限り、インターフェイスを実装しています。Dispatch

あなたはこれを行うことができます、それは私のために構築します:

  public class Foo : IDispatch
  {
    public virtual void Dispatch()
    {
    }
  }
  public class Bar : Foo
  {
    public override void Dispatch()
    {
      base.Dispatch();
    }
  }
于 2012-11-22T16:00:27.843 に答える