0

デフォルトの実装Fooを提供したいインターフェースIFooがあります。Fooは、IFooを実装する他のクラスによって含まれるクラス/コンポーネントとして使用できます。

IFooは、ほとんどがFooに呼び出しを転送することによって実装するいくつかのクラスで使用されますが、一部のメソッドでは、独自の実装を提供する場合があります。

Fooは、呼び出し元のクラスの(プライベート)メンバーにアクセスする必要があります。

これらのメンバーはIFooインターフェイスの一部ではないため(また、そうであるべきではないため)、メソッド呼び出しで引数として渡すことはできません。

この目的のためだけにこれらのメンバーにパブリックプロパティを提供すると、呼び出し元のクラスのインターフェイスが非常に複雑になるため、望ましくありません。

問題は、Fooがこれらのメンバーにアクセスできるようにするための優れた設計とは何か、またはこれは通常どのように達成されるのかということです。このための既知のデザインパターンはありますか?

編集:IFooを実装するクラスは同じクラスから継承できないため、継承はオプションではありません。

4

3 に答える 3

1

あなたが言う相続はありませんか?したがって、基本的にFooクラスはIFooを実装する必要はなく、IFooの実装を簡単にする必要があります。では、なぜメソッドにいくつかのパラメーターを追加できないのでしょうか。このようなもの:

OK、見てみましょう。私がこれを正しく理解したことを確認するためにいくつかの方法を作りましょう:

interface IFoo
{
    void DisplayTime();
}

そしてあなたのFooImplHelper(この例の目的のためだけに静的にされました、あなたの場合にそれが理にかなっているかどうかはわかりません)

public static FooImplHelper
{
    public static void DisplayTime(int UTFOffiset)
    {
        Console.WriteLine(DateTime.UtcNow + TimeSpan.FromHours(UTFOffset));
    }
}

およびIFooの実装

public class MyClock: BaseClock, IFoo
{
     public void DisplayTime()
     {
         FooImplHelper.DisplayTime(2);
     }
}

それは理にかなっていますか?そうでない場合は、さらに情報を提供する必要があります。

Itay、

于 2011-11-14T11:05:56.057 に答える
1

実装メソッドのシグネチャをインターフェイスメソッドのシグネチャと同じように宣言する理由はないため、引数を自由に渡すことができるはずです。例えば:

interface IFoo {
    void MyMethod();
}

static class FooImp {
    public static void MyMethodImp(object private_object) {
        // ...
    }
}

class MyFoo : IFoo {
    public void MyMethod() {
        FooImp.MyMethodImp(m_PrivateObject);
    }
    object m_PrivateObject;
}

または、実装クラスのプライベートオブジェクトを記憶して、compositionを使用することもできます。

interface IFoo {
    void MyMethod();
}

static class FooImp {
    public FooImp(object private_object) {
        m_PrivateObject = private_object;
    }
    public void MyMethodImp() {
        // Use the m_PrivateObject somehow.
    }
    readonly object m_PrivateObject;
}

class MyFoo : IFoo {
    public MyFoo() {
        m_PrivateObject = ... ;
        m_FooImp = new FooImp(m_PrivateObject);
    }
    public void MyMethod() {
        m_FooImp.MyMethodImp();
    }
    object m_PrivateObject;
    readonly FooImp m_FooImp;
}

もちろん、理想的な解決策は、C#がインターフェイスだけでなくクラスの多重継承をサポートしている場合ですが、残念ながらそうではありません。

于 2011-11-14T13:10:49.663 に答える
0

あなたが1つを求めたので、別の可能性。しかし、私は最初のものを好みます。

2番目のインターフェースを定義します。

 interface IFooImplHelper
 {
      int UTFOffset { get; }
 }

FooImplクラスを次のようにします。

 class FooImpl: IFoo
 {
      private IFooImplHelper _helper;

      public FooImpl(IFooImplHelper helper)
      {
           _helper = helper;
      }

      public void DisplayTime()
      {
            Console.WriteLine(DateTime.UtcNow + TimeSpan.FromHours(_helper.UTFDifference);
      }
 }

クライアントは、IFooインターフェイス(FooImplへの呼び出しの転送)とIFooImplHelperインターフェイスの両方を実装する必要があります。私は本当に彼らの誰もが余分な仕事を感謝するとは思わないが...

Itay。

于 2011-11-14T12:08:05.747 に答える