我可以实现一个接口并在返回时将其作为字段吗?

时间:2013-10-23 09:25:11

标签: c# design-patterns interface

我知道这听起来微不足道,但是当我将A变量传递给期望IMyIntercace的函数时,它是否有可能返回b字段?然后我不必在类A中实现Hello()函数,而只是将b作为IMyInterface返回。

interface IMyInterface
{
    void Hello();
}
class A : IMyInterface
{
    B b = new B();
}
class B : IMyInterface
{
    public void Hello()
    {
        Console.WriteLine("Hello");
    }
}
class Program
{
    static void foo(IMyInterface myInterface)
    {
        myInterface.Hello();
    }
    static void Main(string[] args)
    {
        A someVariable = new A();
        foo(someVariable);
    }
}

我想它无法完成,但有没有任何设计模式或技巧可以做到?

修改

我不想得出A的原因是因为我想要这样做

class A : IMyInterface
{
    B b = new B();
    B b2 = new B();
    IMyInterface bPointer;
}

然后我可以根据某些情况指出其中一个

4 个答案:

答案 0 :(得分:0)

你可以从B继承A. A将继续实现界面,您可以覆盖将来需要更改的所有功能。

interface IMyInterface
{
    void Hello();
}
class A : B
{

}
class B : IMyInterface
{
    public void Hello()
    {
        Console.WriteLine("Hello");
    }
}

答案 1 :(得分:0)

没有。 A实现IMyInterface,在这种情况下您不需要执行任何操作,或者不执行任何操作,在这种情况下,无法将任何感兴趣的各方自动“重定向”到{{1}成员。

您可以向外界公开b(并最好将其设为属性),以便他们可以根据需要引用它,或者您可以b实施A和手动将所有来电转发至IMyInterface,如下所示:

b

答案 2 :(得分:0)

只需将A.b公开(或内部),然后拨打foo(someVariable.b)

答案 3 :(得分:0)

您希望拥有的是界面委派,遗憾的是,语言中没有任何内容可以帮助您实现这一目标。

基本上,A类必须实现接口。

它可以做到的一种方式当然是从B得出:

class A : B
{
}

但如果您不想这样做,那么您需要委托。你需要做的是自己实现委托,以便你可以将实际实现的责任委托给B类,你不会得到编译器的任何帮助来解决这个问题。

class A : IMyInterface
{
    B b = new B();

    public void Hello()
    {
        b.Hello();
    }
}