Я пытаюсь создать абстрактный класс, который определяет свойство с помощью геттера. Я хочу оставить это на усмотрение производных классов, чтобы решить, хотят ли они реализовать сеттер для свойства или нет. Возможно ли это?
Что у меня есть на данный момент:
public abstract class AbstractClass {
public abstract string Value { get; }
public void DoSomething() {
Console.WriteLine(Value);
}
}
public class ConcreteClass1 : AbstractClass {
public override string Value { get; set; }
}
public class ConcreteClass2 : AbstractClass {
private string _value;
public override string Value {
get { return _value; }
}
public string Value {
set { _value = value; }
}
}
public class ConcreteClass3 : AbstractClass {
private string _value;
public override string Value {
get { return _value; }
}
public void set_Value(string value) {
_value = value;
}
}
В ConcreteClass1
я получаю сообщение об ошибке в наборе
. Он не может переопределить set_Value
, потому что в AbstractClass не существует переопределяемого метода доступа set.
В ConcreteClass2
я получаю сообщение об ошибке для обоих Value
' s, потому что член с таким же именем уже объявлен.
ConcreteClass3
не выдает ошибки, но даже несмотря на то, что метод доступа Set Value будет скомпилирован в set_Value, наоборот. Определение set_Value
не означает, что Value
получает метод доступа set. Поэтому я не могу присвоить значение свойству ConcreteClass3.Value. Я могу использовать ConcreteClass3.set_Value ("значение"), но это не то, чего я здесь пытаюсь достичь.
Возможно ли, чтобы абстрактный класс требовал общедоступного геттера, при этом разрешая необязательный сеттер должен быть определен в производном классе?
Если вам интересно, это всего лишь теоретический вопрос. У меня нет реальной ситуации, когда нужно что-то подобное. Но я могу представить себе абстрактный класс, который не Меня не волнует, как устанавливается свойство, но для этого нужно иметь возможность получить свойство.