Я пытаюсь создать абстрактный класс, который определяет свойство с помощью геттера. Я хочу оставить это на усмотрение производных классов, чтобы решить, хотят ли они реализовать установщик для свойства или нет. Возможно ли это?
Что у меня так далеко:
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
. Он не может переопределить set_Value
, поскольку в AbstractClass не существует переопределенного метода доступа к множеству.
В ConcreteClass2
я получаю сообщение об ошибке для обоих Value
, поскольку элемент с таким именем уже объявлен.
ConcreteClass3
не выдает ошибку, но даже несмотря на то, что метод доступа Value будет скомпилирован в set_Value, он не работает наоборот. Определение set_Value
не означает, что Value
получает установленный метод доступа. Поэтому я не могу присвоить значение свойству ConcreteClass3.Value. Я могу использовать ConcreteClass3.set_Value ("значение"), но это не то, чего я пытаюсь достичь здесь.
Возможно ли, чтобы абстрактный класс требовал общедоступного метода получения, в то же время позволяя определить необязательный метод установки в производном классе?
Если вам интересно, это всего лишь теоретический вопрос. У меня нет реальной ситуации, когда нужно что-то подобное. Но я могу представить абстрактный класс, который не заботится о том, как устанавливается свойство, но должен иметь возможность получить свойство.