为什么在实现接口时允许更改属性中getter或setter的可见性和存在性?将替代者添加到替代属性
interface IFoo
{
string Bar { get; }
}
class RealFoo : IFoo
{
public RealFoo(string bar)
{
this.Bar = bar;
}
public string Bar { get; private set; }
}
class StubFoo : IFoo
{
public string Bar { get; set; }
}
...并且在执行抽象类时做法不合法吗?
abstract class AbstractFoo : IFoo
{
public abstract string Bar { get; }
}
class RealFoo : AbstractFoo
{
public RealFoo(string bar)
{
this.Bar = bar;
}
// Cannot override because 'Bar' does not have an overridable set accessor
public override string Bar { get; private set; }
}
在您的示例中,您将*代码添加到接口实现中,因为没有setter,但您正在改变抽象类实现中的可见性。所以它不一样。 – jv42 2011-05-19 12:11:55
@ jv42因为setter是* private *,所以在实现中没有改变可视性。限制是任意的和愚蠢的...... C#也可以被指定为允许覆盖仅适用于当它们不是私有时获取或设置。或者它可以允许'公共字符串Bar {override get;私人设置; }' – 2014-10-25 00:35:00
@JimBalter我同意可能有机制来改变访问者的可见性。您可能想要检查C#6中会发生什么,我已经看到了一些有趣的新属性。 – jv42 2014-10-26 09:42:00