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