我有一个接口IFoo,我想为它提供一个默认的实现Foo。 Foo可以被其他实现IFoo的类用作包含的类/组件。
IFoo被多个类使用,这些类主要通过将调用转发给Foo来实现它,但对于某些方法,它们可能提供自己的实现。
Foo需要访问调用类的(私有)成员。
在方法调用中将这些成员作为参数传递是不可能的,因为它们不是(也不应该是)IFoo接口的一部分。
仅为此目的向这些成员提供公共属性是不可取的,因为它会使调用类的接口过于复杂。
问题是:给Foo访问这些成员的好设计是什么,或者这通常是如何实现的?是否有任何已知的设计模式?
编辑:继承不是一个选项,因为实现IFoo的类不能从同一个类继承。
答案 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接口。我真的不认为他们中的任何人会欣赏额外的工作,但是......
伊泰。