Вы должны изменить заголовок вопроса, указав, что ваш вопрос касается только переопределения абстрактного свойства, или что ваш вопрос касается общего переопределения свойства класса только для получения.
Если первое (переопределение абстрактного свойства)
Этот код бесполезен. Сам по себе базовый класс не должен сообщать вам, что вы вынуждены переопределить свойство Get-Only (возможно, интерфейс). Базовый класс предоставляет общие функции, которые могут потребовать определенных входных данных от реализующего класса. Следовательно, общие функции могут вызывать абстрактные свойства или методы. В данном случае общие методы функциональности должны просить вас переопределить абстрактный метод, такой как:
public int GetBar(){}
Но если у вас нет контроля над этим, а функциональность базового класса считывается из его собственного общедоступного свойства (странно), тогда просто сделайте следующее:
public abstract class BaseClass
{
public abstract int Bar { get; }
}
public class ConcreteClass : BaseClass
{
private int _bar;
public override int Bar
{
get { return _bar; }
}
public void SetBar(int value)
{
_bar = value;
}
}
Я хочу указать на (странный) комментарий: я бы сказал, что для класса лучше всего использовать свои собственные общедоступные свойства, а использовать свои закрытые / защищенные поля, когда они существуют. Итак, это лучший образец:
public abstract class BaseClass {
protected int _bar;
public int Bar { get { return _bar; } }
protected void DoBaseStuff()
{
SetBar();
}
protected abstract void SetBar();
}
public class ConcreteClass : BaseClass {
protected override void SetBar() { _bar = 5; }
}
Если последнее (переопределение свойства класса только для получения)
Каждое неабстрактное свойство имеет сеттер. В противном случае это бесполезно, и вам не нужно его использовать. Microsoft не обязана позволять вам делать то, что вы хотите. Причина в том, что сеттер существует в той или иной форме, и вы можете легко выполнить то, что хотите, Veerryy .
Базовый класс или любой класс, с помощью которого вы можете читать свойство {get;}
, имеет НЕКОТОРЫЙ вид открытого сеттера для этого свойства. Метаданные будут выглядеть так:
public abstract class BaseClass
{
public int Bar { get; }
}
Но реализация будет иметь два конца спектра сложности:
Наименее сложный:
public abstract class BaseClass
{
private int _bar;
public int Bar {
get{
return _bar;
}}
public void SetBar(int value) { _bar = value; }
}
Самый сложный:
public abstract class BaseClass
{
private int _foo;
private int _baz;
private int _wtf;
private int _kthx;
private int _lawl;
public int Bar
{
get { return _foo * _baz + _kthx; }
}
public bool TryDoSomethingBaz(MyEnum whatever, int input)
{
switch (whatever)
{
case MyEnum.lol:
_baz = _lawl + input;
return true;
case MyEnum.wtf:
_baz = _wtf * input;
break;
}
return false;
}
public void TryBlowThingsUp(DateTime when)
{
_kthx = DaysSinceEaster(when);
}
public int DaysSinceEaster(DateTime when)
{
return 2;
}
}
public enum MyEnum
{
lol,
wtf,
}
Я хочу сказать, что в любом случае у вас есть сеттер. В вашем случае вы можете захотеть переопределить, int Bar
потому что вы не хотите, чтобы базовый класс обрабатывал его, у вас нет доступа для проверки того, как он его обрабатывает, или вам было поручено очень быстро взломать какой-то код против вашей воли .
Как в последнем, так и в прошлом (Заключение)
Вкратце: Microsoft не нужно ничего менять. Вы можете выбрать способ настройки вашего реализующего класса и, без конструктора, использовать весь базовый класс или ни один из них.