ここでコードの匂いがします。基本クラスのすべての機能を実装している場合にのみ、基本クラスを継承する必要があるというのが私の意見です。あなたがしていることは、実際にはオブジェクト指向の原則を適切に表していません。したがって、ベースから継承したい場合は、 Name を実装する必要があります。そうしないと、継承が間違った方法で行われます。クラス A は基本クラスである必要があり、現在の基本クラスは A から継承する必要があります。それが必要な場合は、その逆ではありません。
ただし、直接の質問から離れすぎないようにしてください。「ルール」を無視して、選択したパスを続行したい場合は、次の方法で実行できます。
慣例では、プロパティを実装しますが、そのプロパティが呼び出されたときに NotImplementedException をスローしますが、それも好きではありません。しかし、それは私の個人的な意見であり、この慣習がまだ有効であることに変わりはありません。
プロパティを廃止しようとしている (そしてそれが基本クラスで仮想として宣言されている) 場合は、 Obsolete 属性を使用できます。
[Obsolete("This property has been deprecated and should no longer be used.", true)]
public override string Name
{
get
{
return base.Name;
}
set
{
base.Name = value;
}
}
(編集: Brian がコメントで指摘したように、属性の 2 番目のパラメーターは、誰かが Name プロパティを参照するとコンパイラ エラーを引き起こすため、派生クラスで実装したとしても、それを使用することはできません。 )
または、私が述べたように、NotImplementedException を使用します。
public override string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
ただし、プロパティが virtual として宣言されていない場合は、 new キーワードを使用して置き換えることができます。
public new string Name
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
メソッドがオーバーライドされた場合と同じ方法で Obsolete 属性を引き続き使用することも、NotImplementedException をスローすることもできます。私はおそらく使用します:
[Obsolete("Don't use this", true)]
public override string Name { get; set; }
また:
[Obsolete("Don't use this", true)]
public new string Name { get; set; }
基本クラスで仮想として宣言されているかどうかによって異なります。