使用member作为实现者实现接口

我有A级实现IA。
现在我需要创建应该也实现IA的B类。 B类具有A类实例作为成员。

有没有办法来定义A的实例在B类中实现IA?

interfase IA { void method1(); void method2(); . . . . void methodN(); } class A:IA { public void method1(){} public void method2(){} . . . . public void methodN(){} } class B:IA { private IA m_a; public B(IA a) { m_a=a; } //Instead all of this I am looking of a way to define that m_a is the implement to IA of B public void method1(){ use of a.method1 } public void method2(){ use of a.method2 } . . . . public void methodN(){ use of a.methodN } } 

如果B确实应该实现IA ,那么B 必须逐个重新定义每个接口方法,即使每个实现只是对封装的A成员的实现的调用。

然而,从实际的角度来看,有一种懒惰的方法可以阻止你从所有这些乏味的东西,并且可以被认为几乎相同:

 class Program { static void Main(string[] args) { CatOwner Bob = new CatOwner(); Console.WriteLine(((Cat)Bob).Cry); Console.ReadKey(); } } interface ICry { string Cry { get; } } class Cat : ICry { public string Cry { get { return "Meow !"; } } } class CatOwner { private Cat _MyCat; public CatOwner() { _MyCat = new Cat(); } public static implicit operator Cat(CatOwner po) { return po._MyCat; } } 

CatOwner并没有真正实现Cry因为猫主人不是那个喵喵叫的人:他的猫。 但作为一种近似,我们可以考虑通过要求猫主人哭泣,我们当然意味着这种需求实际上是针对他的猫,而不是主人本身。 然后我们“把猫主人扔给他的猫”然后我们可以让他Cry

这很有趣,不是吗? 🙂

编辑:

也就是说,马格努斯的回答非常值得考虑恕我直言。 考虑到语义上下文,如果传递成员很好,它看起来更合乎逻辑,也更干净。 如果B只是一种不能inheritance(密封)的A的增强变体,或者在这样一个特定的上下文中,我的解决方案可能仍然很有趣……真的取决于上下文和语义约束……

不是真的,你可能想要定义某种返回IA成员的接口,比如Enumerable / Enumerator模式。

 public interface IB { public IA Item { get; } } 

那么B可以简单地返回你存储在其中的实例。

 public class B : IB { public IA Item { get; private set; } } 

A甚至可以实施IB

 public class A : IA, IB { public void Method1(); //... public void MethodN(); IA IB.Item { get { return this; } } } 

从A中获取B就是您所需要的。

 class B:A { public B() { } } 

你基本上有两个选择:从Ainheritance,或封装A 这基本上是两种设计模式之间的差异: 封装和inheritance 。

不确定,但为什么要从IAinheritanceB类? 你已经在B类中拥有了对象A的实例,你可以使用它……

如何在属性中公开“实现者”而不是B实现接口。

 class B { public IA Implementer {get; private set;} public B(IA a) { Implementer = a; } } 

从设计角度看问题,这是一个非常有效的问题(在更复杂的现实生活中),只要说成员m_a是实现所有IA的那个,就可以保存很多代码行。 B中的界面

我不太同意从A:1中inheritanceB的建议在现实生活中,B可以从另一个不相关的类inheritance,或者说你正在实现IC和ID,并且有成员m_c和m_d会很高兴能够将C的实现指向m_c并将ID实现为m_d..etc 2-用inheritance替换聚合通常是一个糟糕的设计。

好主意虽然..