接口引用另一个接口但类引用C#中的另一个类

时间:2013-05-03 10:53:26

标签: c#

我有一个非常简单的问题,但我之前没有遇到过这个问题。

看看这段代码:

interface IFoo
{
    IBar MyBar { get; }
}

interface IBar
{
    String Test { get; }
}

class Foo : IFoo
{
    public Bar MyBar { get; set; }
}

class Bar : IBar
{
    public String Test { get; set; }
}

问题是Foo没有实现IFoo,因为它返回Bar而不是IBar。但是,由于Bar正在实施IBar,我没有看到问题。我想念一下吗?

我希望我的应用程序使用Foo类,但将IFoo暴露给解决方案的其他部分。

这是一种方法,但它似乎是一个丑陋的解决方案:

class Foo : IFoo
{
    public Bar MyBar { get; set; }
    IBar IFoo.MyBar { 
        get { return this.MyBar; }
    }
}

这是要走的路,还是更好的方式?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

interface IFoo<out B> where B:IBar
{
    B MyBar { get; }
}

interface IBar
{
    String Test { get; }
}

class Foo : IFoo<Bar>
{
    public Bar MyBar { get; set; }
}

class Bar : IBar
{
    public String Test { get; set; }
}

这仅适用于B处于输出位置的情况(出于显而易见的原因,如果你考虑的时间足够长)。

答案 1 :(得分:-1)

  

问题是Foo没有实现IFoo,因为它返回Bar而不是IBar。但是,由于Bar正在实施IBar,我没有看到问题。我想念一下吗?

是。您错误解释了IFoo接口的合同。合同很简单:

一个名为MyBar的属性,它有一个getter,的返回类型为IBar。合同不是它返回一个IBar类型的对象,它是&#39;返回类型是IBar类型。

这是标准的。尝试实现ICloneable接口,该接口具有单个方法Clone(),返回类型为object。实现此接口意味着您必须实现返回类型为object的方法,无论如何。即使您更具体一点,任何其他类型的返回类型都不具备资格。

你建议的方法是正确的方法之一 - 拥有一个返回Bar属性的IBar属性。或者,你知道,你可以只有一个IBar属性并将其设置为Bar实例,因为它完全有效,然后通过IBar合同处理你的IBar对象。这有助于解耦。