override
キーワードを使用する必要があります。それ以外の場合は、抽象基本クラスを実装せず、サブクラスに「新しい」個別のメソッドを作成するだけです。
public override bool Save(SpaghettiTable obj)
{
return false;
}
メソッドは、オーバーライドするabstract
メソッドと同じように考えてください。virtual
唯一の違いは、サブクラスにそのメソッドの実装を提供するように強制するのに対し、virtual
メソッドは独自の実装を提供し、サブクラスはオプションで独自の実装でオーバーライドできることです。
編集:さらに、Visual Studioでの作業を楽にしたい場合はctrl+.
、継承宣言を右クリック(または)して、「抽象クラスの実装」を選択できます(またはそのようなものです。私にはVSがありません。今)これはあなたのためにすべてのオーバーライドされたメソッドを自動的に作成します。
public class SpaghettiTableDb : DbHandler<SpaghettiTable> //right-click on "DbHandler"
または、クラス内の空のコードスペースで、「override」と入力し始めると、IntelliSenseは基本クラスからすべてのオーバーライド可能なメンバーを一覧表示し、1つを選択すると、デフォルトの実装が自動的に書き込まれます。
編集:キーワードなしでコードにあるものを拡張するoverride
ために、サブクラスに属し、基本クラスをオーバーライドしない新しいメソッドを作成しています。そのメソッドを呼び出すが、基本クラスを使用するコンテキストからは、基本メソッドをオーバーライドしないため、サブクラスの実装は呼び出されません。
次のクラスを検討してください。(私は抽象ではなく仮想を使用しているので、コンパイルして単純にします)
public class BaseClass
{
public virtual void Print()
{
Console.WriteLine("base print");
}
public virtual void AnotherPrint()
{
Console.WriteLine("base another print");
}
}
public class SubClass : BaseClass
{
public override void Print()
{
Console.WriteLine("sub print");
}
public void AnotherPrint()
{
Console.WriteLine("sub another print");
}
}
をオーバーライドSubClass.AnotherPrint
しないことに注意してくださいBaseClass.AnotherPrint
。
そして、次のようなコードを使用する場合:
SubClass mySub = new SubClass();
mySub.Print(); //sub print
mySub.AnotherPrint(); //sub another print
BaseClass myBase = mySub;
myBase.Print(); //sub print
myBase.AnotherPrint(); //base another print
コードを介して、両方が同じオブジェクトを指していることに注意してくださいmySub
。myBase
ただし、一方はとして入力されSubClass
、もう一方はとして入力されBaseClass
ます。ランタイムがを呼び出すとmyBase.Print()
、クラスの継承を簡単にチェックして、それがメソッドをSubClass
オーバーライドし、実装を呼び出すことを確認できます。ただし、明示的にマークされていないため、ランタイム/コンパイラは、メソッドへのリンクがない完全に異なるメソッドであると見なします。したがって、ランタイムは基本クラスの実装に固執します。ただし、インスタンスがそのように入力されると、コンパイラは、基本的に基本実装ではなく、その新しいメソッドを指していることを認識します。Print
SubClass
SubClass.AnotherPrint
override
BaseClass.AnotherPrint
SubClass