この基本クラスがあります:
abstract class Base
{
public int x
{
get { throw new NotImplementedException(); }
}
}
そして、次の子孫:
class Derived : Base
{
public int x
{
get { //Actual Implementaion }
}
}
コンパイルすると、派生クラスのx
の定義がBaseのバージョンを非表示にするという警告が表示されます。メソッドのようなC#のプロパティをオーバーライドすることは可能ですか?
virtual
キーワードを使用する必要があります
abstract class Base
{
// use virtual keyword
public virtual int x
{
get { throw new NotImplementedException(); }
}
}
または、抽象プロパティを定義します。
abstract class Base
{
// use abstract keyword
public abstract int x { get; }
}
子の場合はoverride
キーワードを使用します。
abstract class Derived : Base
{
// use override keyword
public override int x { get { ... } }
}
オーバーライドしない場合は、メソッドでnew
キーワードを使用して、親の定義を非表示にすることができます。
abstract class Derived : Base
{
// use override keyword
public new int x { get { ... } }
}
基本プロパティを抽象化し、派生クラスで新しいキーワードをオーバーライドまたは使用します。
abstract class Base
{
public abstract int x { get; }
}
class Derived : Base
{
public override int x
{
get { //Actual Implementaion }
}
}
または
abstract class Base
{
public int x { get; }
}
class Derived : Base
{
public new int x
{
get { //Actual Implementaion }
}
}
abstract class Base
{
public virtual int x
{
get { throw new NotImplementedException(); }
}
}
または
abstract class Base
{
// use abstract keyword
public abstract int x
{
get;
}
}
どちらの場合でも、派生クラスで記述する必要があります
public override int x
{
get { your code here... }
}
2つの違いは、abstractでは派生クラスに強制的に何かを実装させ、virtaulでは派生者がそのまま使用または変更できるデフォルトの動作を提供できることです。
abstract class Base
{
// use abstract keyword
public virtual int x
{
get { throw new NotImplementedException(); }
}
}