可以在构造函数中初始化但之后只能只读的C#抽象属性?

时间:2018-10-31 20:21:25

标签: c# inheritance

在课堂上我有一个财产

protected abstract string test{ get; }

当我尝试在构造函数中初始化它时。我收到一条错误消息:

  

属性或索引器xxx无法分配给。 -它是只读的。

有没有办法允许某些财产成为

  1. 抽象
  2. 在ctor中初始化后为只读?

2 个答案:

答案 0 :(得分:2)

您可能不希望拥有abstract属性。仅当您要强制派生类提供自定义实现时,才使用它。就您而言,您只希望在构造函数和readonly中进行设置。

public abstract class Bar
{
    protected string Test { get; }

    public Bar(string test)
    {
        Test = test;
    }
}

public class Foo : Bar
{
    public Foo() : base("It Works!")
    { }
}

答案 1 :(得分:0)

在派生类中使用私有设置器简单地实现抽象方法:

class Derived : Base
{
    protected override string test { get; } = "MyInitialValue";
}

or before C#6 with a readonly backing-field:

class Derived : Base
{
    private readonly string _test = "MyInitialValue";
    protected override test { get { return this._test; } }
}

这允许您为不同的类设置不同的值。如果您不需要它,并且所有类都应具有完全相同的值,则可以在基类中定义它,以使其成为非抽象类。

您还可以在派生类中使用私有设置器。这使其对其他类只读,但是您也可以在构造函数之外的类中设置值。