我有一个非常简单的问题,但我之前没有遇到过这个问题。
看看这段代码:
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; }
}
}
这是要走的路,还是更好的方式?
答案 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对象。这有助于解耦。