1

次のものが必要であることがよくあります。

public interface IMyThing
{
    void Function1();
    void Function2();
    void Function3();
    void Function4();
    void Function5();
}

public abstract class BaseMyThing : IMyThing
{
    // Implement a version of Function1, but Function 2-5 is up to the concrete class to do
    public void Function1()
    {
        // Do stuff.
    }

    public virtual void Function2();
    public virtual void Function3();
    public virtual void Function4();
    public virtual void Function5();
}

public class ConcreteMyThing : BaseMyThing, IMyThing
{
    public new void Function2() { /* something */ }
    public new void Function3() { /* something */ }
    public new void Function4() { /* something */ }
    public new void Function5() { /* something */ }
}

これはかなり面倒です。インターフェースに何かを追加するたびに、抽象クラスでそれをスタブする必要があります。それは世界の終わりではありませんが、ここで次善の策を講じているかどうか興味があります - ここでコードの共有ビットの部分的な機能を取得するより良い方法はありますか?

4

3 に答える 3

0

Function2からFunction5は基底クラスではなく派生クラスで使われていると思います。次に、 に追加するのでIMyThingはなく、それぞれに個別のインターフェイスを持たせる必要があります。

例:

public interface IMyThing
{
    void Function1();
}

public abstract class BaseMyThing : IMyThing
{
    // Implement a version of Function1, but Function 2-5 is up to the concrete class to do
    public void Function1()
    {
        // Do stuff.
    }
}

public interface IMyThingConcrete{
  void FunctionConcrete();
}

public class ConcreteMyThing : BaseMyThing, IMyThingConcrete
{
    public void FunctionConcrete() { /* something */ }
}

さらに、ConcreteMyThing で IMyThing を再実装する必要はありません。BaseMyThing を継承しているため、既に IMyThing が実装されています。

ConcreteMyThing から FunctionConcrete にアクセスする例:

public void AccessFunctionConcrete(IMyThingConcrete myThing){
  myThing.FunctionConcrete();
}
于 2013-04-04T05:25:54.037 に答える