1

次のコードでコンパイルエラーが発生します:

public abstract class DbHandler<T>
{
    public abstract bool Save(T obj);
    ...
}

およびその実装クラス:

 public class SpaghettiTableDb : DbHandler<SpaghettiTable>
 {
    public bool Save(SpaghettiTable obj)
    {
        return false;
    }
    ...
 }

エラーは次のとおりです。

'SpaghettiTableDb' does not implement inherited abstract member 'SeatPicker.DbHandler<SeatPicker.SpaghettiTable>.Save(SeatPicker.SpaghettiTable)'

しかし、そうだと思うので、なぜこのエラーが発生するのかわかりません。

(SpaghettiTableは、いくつかのプロパティを持つ単なるクラスであり、それ以上のものではありません)

何か助けはありますか?

4

2 に答える 2

5

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

コードを介して、両方が同じオブジェクトを指していることに注意してくださいmySubmyBaseただし一方はとして入力されSubClass、もう一方はとして入力されBaseClassます。ランタイムがを呼び出すとmyBase.Print()、クラスの継承を簡単にチェックして、それがメソッドをSubClassオーバーライドし、実装を呼び出すことを確認できます。ただし、明示的にマークされていないため、ランタイム/コンパイラは、メソッドへのリンクがない完全に異なるメソッドであると見なします。したがって、ランタイムは基本クラスの実装に固執します。ただし、インスタンスがそのように入力されると、コンパイラは、基本的に基本実装ではなく、その新しいメソッドを指していることを認識します。PrintSubClassSubClass.AnotherPrintoverrideBaseClass.AnotherPrintSubClass

于 2012-08-25T14:47:42.107 に答える
2

override抽象メソッドを実装するとき、または仮想メソッドをオーバーライドするときに、キーワードを使用する必要があります。

public override bool Save(SpaghettiTable obj)
{
    return false;
}
于 2012-08-25T14:48:19.840 に答える