-1

我知道这听起来微不足道,但是当我将 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;
}

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

4

4 回答 4

0

只需A.b公开(或内部),然后调用foo(someVariable.b).

于 2013-10-23T09:30:29.287 回答
0

你想要的是接口委托,不幸的是,语言中没有任何东西可以帮助你。

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

它可以做到这一点的一种方法当然是从B

class A : B
{
}

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

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

    public void Hello()
    {
        b.Hello();
    }
}
于 2013-10-23T09:30:40.680 回答
0

您可以从 B 继承 A。A 将继续实现该接口,并且您可以覆盖将来需要更改的每个函数。

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

}
class B : IMyInterface
{
    public void Hello()
    {
        Console.WriteLine("Hello");
    }
}
于 2013-10-23T09:29:36.210 回答
0

不。要么A实现IMyInterface,在这种情况下你不需要做任何事情,或者它不需要,在这种情况下,没有办法自动将任何相关方“重定向”到b成员。

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

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

    public void Hello()
    {
        b.Hello();
    }
}
于 2013-10-23T09:29:45.587 回答