C # абстрактное свойство, которое может быть инициализировано в конструкторе, но потом только для чтения? - PullRequest
0 голосов
/ 31 октября 2018

В классе у меня есть свойство

protected abstract string test{ get; }

Когда я пытаюсь инициализировать его в конструкторе. Я получаю сообщение об ошибке:

Свойство или индексатор xxx не могут быть назначены. - только для чтения.

Есть ли способ разрешить некоторому свойству быть

  1. аннотация
  2. Только для чтения после инициализации в ctor?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Просто реализуйте абстрактный метод с помощью частного установщика в вашем производном классе:

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; } }
}

Это позволяет вам устанавливать разные значения для разных классов. Если вам это не нужно и все классы должны иметь одинаковое значение, вы можете определить его в своем базовом классе, сделав его неабстрактным.

Вы также можете использовать частный сеттер в своем производном классе. Это делает его доступным только для других классов, но вы также можете установить значение внутри вашего класса вне конструктора.

0 голосов
/ 31 октября 2018

Возможно, вы не хотите 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!")
    { }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...