【发布时间】:2011-08-28 20:06:43
【问题描述】:
为什么允许在实现接口时更改属性中 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; }
}
【问题讨论】:
-
在您的示例中,您正在向接口实现添加代码,因为没有设置器,但您正在更改中的可见性抽象类实现。所以就不一样了。
-
@jv42 由于设置器是 private,因此在实现中没有更改可见性。该限制是任意且愚蠢的......也可以指定 C# 以允许覆盖仅在它们不是私有时应用于获取或设置。或者它可以允许
public string Bar { override get; private set; } -
@JimBalter 我同意可能存在改变访问者可见性的机制。您可能想查看 C# 6 中的新内容,我已经看到了一些有趣的属性新内容。
-
@jv42 我已经知道 C# 6 中会发生什么,但它不存在。关键是您的评论错误。
-
@JimBalter 好吧,那我们就意见不合了。
标签: c# properties abstract