0

私はクラスを持っています:

  class Stock : Product
  {
  }

そしてそのクラスで私はEqualsメソッドを作りました:

  public bool Equals(Product p)
  {
      return (p.Id == this.Id);
  }

しかし、それは機能していません。それは私にそれを教えてくれますEquals

警告1'WindowsFormsApplication1.Stock.Equals(WindowsFormsApplication1.Product)'は、継承されたメンバー' WindowsFormsApplication1.Product.Equals(WindowsFormsApplication1.Product)'を非表示にします。非表示にする場合は、新しいキーワードを使用します。

C:\Users\tom\Desktop\uni\WindowsFormsApplication1\WindowsFormsApplication1\WindowsFormsApplication1\Stock.cs    36  21  WindowsFormsApplication1

なぜこれなのか誰もが知っていますか?

4

5 に答える 5

7

EqualsProductClassですでに使用されているメソッドをオーバーライドする必要があります。

public override bool Equals(Product p)
{
    return (p.Id == this.Id);
}

またはnewキーワードを使用します。しかし、私は「新しい」があなたが望むものだとは思いません。

于 2012-08-07T09:48:13.423 に答える
5

Equalsから継承されSystem.Objectます。すべてのオブジェクトはこのクラスを継承します。

public override bool Equals(object p)
{    
    return ((Stock)p.Id == this.Id);
}

編集:オーバーライドするには、パラメーターが同じタイプである必要があります。そのobject中にはオブジェクト型があります。このメソッドを次のProductように宣言した場合:

public bool Equals(Product p)
{    
    return (p.Id == this.Id);
}

次に、Stock.EqualsのパラメータタイプをProductに変更する必要があります。ただし、このEqualsメソッドは隠れてobject.Equalsおり、これは適切な設計ではないと思います。メソッドを正しく使用する場合はEquals、オーバーライドする必要があります。これは、多くのコンポーネントがコレクションを検索するときにこのメソッドを呼び出しobject.Equals、非表示を使用してオーバーライドしない場合は、とにかく呼び出してコードを使用しないためです。これらのメソッドがプロジェクトの内部にあり、object.Equalsメカニズムに関連していない場合は、混乱を避けるために、このメソッドに別の名前を選択してください。

于 2012-08-07T09:48:19.413 に答える
0

これは単なる警告であり、期待どおりに機能します。製品クラスがを定義しEqualsているため、子クラスStockは独自のEqualsメソッドを定義しています。

次のクラス設定があると仮定します。

class Product
{
    public bool Equals(Product p)
    {
        return true;
    }
}

  class Stock : Product
    {
        public bool Equals(Product p)
        {
            return true;
        }
    }

ここで警告が表示されます。

Stock.Equals(Product)'は、継承されたメンバー' Product.Equals(Product)'を非表示にします。非表示にする場合は、新しいキーワードを使用します。

キーワードを使用するだけnewで、コンパイラーに「はい」を非表示にすることを意図していることを伝えることができます。したがって、在庫内のメソッドは次のclassようになります。

new public bool Equals(Product p)
{
    return true;
}

あなたは新しい修飾子を見たいかもしれません-msdn

于 2012-08-07T09:48:20.090 に答える
0

bool Equals(Product)にすでにメソッドが定義されているようです。Productそれを仮想化し、でオーバーライドしますStock

于 2012-08-07T09:48:42.203 に答える
0

親メソッドの置換を暗黙的に宣言するには、オーバーライドを設定する必要があります。

public override bool Equals(Product p)     
{          
   return (p.Id == this.Id);      
} 

この警告は、コーダーが親メソッドの不要なオーバーライドを回避するのに役立ちます。

于 2012-08-07T09:51:37.387 に答える