用作包含组件的接口的默认实现

时间:2011-11-14 11:02:42

标签: .net interface containment

我有一个接口IFoo,我想为它提供一个默认的实现Foo。 Foo可以被其他实现IFoo的类用作包含的类/组件。

IFoo被多个类使用,这些类主要通过将调用转发给Foo来实现它,但对于某些方法,它们可能提供自己的实现。

Foo需要访问调用类的(私有)成员。

在方法调用中将这些成员作为参数传递是不可能的,因为它们不是(也不应该是)IFoo接口的一部分。

仅为此目的向这些成员提供公共属性是不可取的,因为它会使调用类的接口过于复杂。

问题是:给Foo访问这些成员的好设计是什么,或者这通常是如何实现的?是否有任何已知的设计模式?

编辑:继承不是一个选项,因为实现IFoo的类不能从同一个类继承。

3 个答案:

答案 0 :(得分:1)

你说没有继承吗?所以基本上你的Foo类不需要实现IFoo,它只需要很容易实现IFoo。为什么不能为方法添加一些参数呢?像这样:

好的,我们来看看。让我编写一些方法来确保我做对了:

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);
     }
}

这有意义吗?如果没有,你将不得不提供更多信息。

伊泰,

答案 1 :(得分: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;
}

或者,您可以只记住实现类中的私有对象并使用组合:

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#支持类的多重继承,而不仅仅是接口,但实际情况并非如此。

答案 2 :(得分:0)

另一种可能性,因为你要求一个。不过,我更喜欢第一个。

定义第二个界面:

 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接口(Forwarding对FooImpl的调用)和IFooImplHelper接口。我真的不认为他们中的任何人会欣赏额外的工作,但是......

伊泰。

相关问题