Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以实现一个接口并在返回它时将其作为字段吗?_C#_Design Patterns_Interface - Fatal编程技术网

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

C# 我可以实现一个接口并在返回它时将其作为字段吗?,c#,design-patterns,interface,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() {

我知道这听起来很简单,但当我将一个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,您可以从b继承A。 A将继续实现该接口,您可以覆盖将来需要更改的每个函数

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

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

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

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

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

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

只需将
A.b
public(或internal),然后调用
foo(someVariable.b)

您想要的是接口委派,不幸的是,该语言中没有内置任何东西可以帮助您实现这一点

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

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

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

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

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

你为什么有这样的需要?设计将取决于您想要实现什么?为什么不
class A:B
?不应建议将继承作为“机械”问题的解决方案。在域模型中,A扩展B是有意义的,或者是没有意义的。