【发布时间】:2020-10-29 16:39:08
【问题描述】:
我一直在学习 C# 继承和接口(@987654321@、2、3)。在下面的示例中,为什么在派生类中设置属性时没有编译器错误,而派生类通过自动属性将属性设置为只读?
using System;
public interface IFoo {
string Title { get; set; }
}
public abstract class AbstractFoo : IFoo {
public virtual string Title { get; set; }
}
public class Foo : AbstractFoo {
public string Title { get; set; }
}
public class Bar : AbstractFoo {
public override string Title { get { return "Read Only Title"; } }
}
public class Program
{
public static void Main()
{
var foo = new Foo();
Console.WriteLine(foo.Title);
var bar = new Bar();
Console.WriteLine(bar.Title); // output: "Read Only Title"
bar.Title = "A new and better title!"; // Why does this not generate an error?
Console.WriteLine(bar.Title); // output: "Read Only Title" - value was not set
}
}
根本问题,是否有可能阻止bar.Title 成为set,即仅为该派生类的只读字段?我在其他related answers 中看到new 关键字可用于重新声明派生类中的属性,但同时建议不要这样做。
【问题讨论】:
-
我认为
Bar仍然有一个从AbstractFoo继承的Title设置器。当然,它被覆盖的 getter 永远不会返回通过该 setter 设置的值。 -
同时应用
abstract而不是virtual表明Bar不再实现setter
标签: c# inheritance interface