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

时间:2011-06-07 08:06:53

标签: c# .net

我有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 }
}

7 个答案:

答案 0 :(得分:3)

实际上,您可能想要定义某种返回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;
        }
    }
}

答案 1 :(得分:1)

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

class B:A {

    public B() {

    }
}

答案 2 :(得分:1)

您基本上有两个选择:从A继承,或封装A。这基本上是两种设计模式之间的差异:encapsulationinheritance

答案 3 :(得分:1)

如果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只是一种不能被继承(密封)的A的增强变种,或者在这样一个特定的上下文中,我的解决方案可能仍然很有趣......真的取决于上下文和语义约束...

答案 4 :(得分:0)

不确定,但为什么要从IF继承B类?你已经有了B类对象A的实例,你可以使用它......

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

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

好主意虽然..