爲什麼在實現接口時允許更改屬性中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