2

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

看看这段代码:

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; }
    }
}

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

4

2 回答 2

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输出位置的情况(出于显而易见的原因,如果您考虑足够长的时间)。

于 2013-05-03T11:06:20.587 回答
-1

问题是 Foo 没有实现 IFoo,因为它返回 Bar 而不是 IBar。但我没有看到问题,因为 Bar 正在实施 IBar。我错过了什么吗?

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

一个名为 MyBar 的属性,它有一个 getter,并且返回类型为 IBar。合同不是它返回一个 IBar 类型的对象,而是返回类型是 IBar 类型。

这是标准的。尝试实现ICloneable接口,它有一个方法,Clone(),返回类型为objectobject实现这个接口意味着无论如何你都必须实现一个返回类型为 的方法。即使您希望更具体一点,任何其他返回类型也不符合条件。

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

于 2013-05-03T12:59:11.867 回答