質問のタイトルを変更して、質問が抽象プロパティのオーバーライドのみに関するものであること、または質問がクラスの取得専用プロパティの一般的なオーバーライドに関するものであることを詳しく説明する必要があります。
前者の場合(抽象プロパティのオーバーライド)
そのコードは役に立たない。基本クラスだけでは、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();
//Do something with _bar;
}
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)
{
//Some Crazy Madeup Code
_kthx = DaysSinceEaster(when);
}
public int DaysSinceEaster(DateTime when)
{
return 2; //<-- calculations
}
}
public enum MyEnum
{
lol,
wtf,
}
私のポイントは、いずれにせよ、セッターが公開されているということです。あなたの場合、int Bar
基本クラスにそれを処理させたくない、それがどのように処理されているかを確認するためのアクセス権がない、またはあなたの意志に反していくつかのコードを本当に素早く汚すように命じられたので、オーバーライドしたいかもしれません.
後者と前者の両方で(結論)
簡単な説明: Microsoft が何かを変更する必要はありません。実装クラスのセットアップ方法を選択し、コンストラクターを使用せずに、基本クラスをすべて使用するか、まったく使用しないかを選択できます。