C# ポリモーフィズムでこのコード フォーム MSDN リソースを選びました。
public class A
{
public virtual void DoWork() { }
}
public class B : A
{
public override void DoWork() { }
}
public class C : B
{
public override void DoWork()
{
// Call DoWork on B to get B's behavior:
base.DoWork();
// DoWork behavior specific to C goes here:
// ...
}
}
クラス C は B の DoWork() をオーバーライドしていますが、クラス B の DoWork() メソッドは仮想化されていません。C は B のすべてのメソッドとデータを継承するので、A の仮想メソッドも継承しますか (A は B の基本クラスであるため、B で使用できます)。
B が DoWork() の実装を提供しない場合、C は A の仮想メソッドのコピーに直接アクセスしてそれをオーバーライドするでしょうか?
また、C が B から継承する場合、A のメンバーの個別のコピーまたは B のメンバーのコピーを取得します。A のメンバーの個別のコピーについては、A を個別に継承する必要があると思います。
public class C : A, B
間違っている場合は修正してください。
編集 :
public class A
{
public virtual void DoWork()
{
Console.WriteLine("In Class A");
}
}
public class B : A
{
public void DoWork() { Console.WriteLine("In Class B"); }
}
public class C : B
{
public void DoWork()
{
Console.WriteLine("In Class C");
base.DoWork();
}
}
これを VS C# で実行すると、virtual キーワードは必要ありません。クラス B の DoWork() ではキーワードをオーバーライドし、クラス B および C の DoWork() ではキーワードをオーバーライドします。つまり、パブリック クラス C のように、クラス名の定義でどの基本クラスが派生されているかを指定するだけでよいのでしょうか?
また、C# はクラスの多重継承のオプションを提供していないため、A のオブジェクトを明示的に作成し、それを使用して DoWork() にアクセスせずに、C のクラスから A の DoWork() の実装を直接使用する方法はありますか?