【问题标题】:Can I implement an interface and have it as a field when returning it?我可以实现一个接口并在返回它时将其作为一个字段吗?
【发布时间】:2013-10-23 09:25:11
【问题描述】:

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

【问题讨论】:

  • 你为什么有这样的需求?设计将取决于您想要实现什么?
  • 为什么不class A : B

标签: c# design-patterns interface


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    您可以将b (最好将其设为属性)暴露给外界,以便他们可以根据需要引用它,或者您可以使A 实现IMyInterface 并手动将所有调用转发给@ 987654327@这样的:

    class A : IMyInterface
    {
        B b = new B();
    
        public void Hello()
        {
            b.Hello();
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        class A : B
        {
        }
        

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

        class A : IMyInterface
        {
            B b = new B();
        
            public void Hello()
            {
                b.Hello();
            }
        }
        

        【讨论】:

        • 不应建议将继承作为“机械”问题的解决方案。要么在领域模型中 A 扩展 B 有意义,要么没有。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        • 2021-10-20
        • 2016-07-03
        • 1970-01-01
        • 2012-03-30
        • 1970-01-01
        • 2017-05-25
        相关资源
        最近更新 更多