6

重複の可能性:
プロパティ宣言の「new」キーワード

これが C# 101 の場合は申し訳ありませんが、以下のコードを理解しようとしています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Generics
{
    class RabbitCollection : ArrayList
    {
        public int Add(Rabbit newRabbit)
        {
            return base.Add(newRabbit);
        }

        //collections indexer 
        public new Rabbit this[int index]
        {
            get { return base[index] as Rabbit; }
            set { base[index] = value; }
        }
    }
}

newインデクサーの前にあるのはなぜですか? ちなみにRabbitは別ファイルで定義されたクラスです。ありがとう!

4

4 に答える 4

6

コードから new を削除してみてください。警告が表示されます。

RabbitCollection.this[int]'は、継承されたメンバー 'System.Collections.ArrayList.this[int]' を非表示にします。現在のメンバーでその実装をオーバーライドするには、override キーワードを追加します。それ以外の場合は、新しいキーワードを追加してください。

新しい Modifier C#を見たいと思うかもしれません

new キーワードは、基本クラスから継承されたメンバーを明示的に非表示にします。継承されたメンバーを非表示にすると、メンバーの派生バージョンが基底クラス バージョンを置き換えます。new 修飾子を使用せずにメンバーを非表示にすることはできますが、結果は警告になります。new を使用してメンバーを明示的に非表示にすると、この警告が抑制され、派生バージョンが代替として意図されているという事実が文書化されます。

于 2012-07-27T03:24:33.003 に答える
4

基本クラス ( ArrayList) にもインデクサーがあるためです。はnew、「基本クラスのメンバーを自分のメンバーに意図的に置き換えています」と述べています。

がなくても機能しますnewが、newは、自分が何をしているのかを知っていることをコンパイラに伝えます。

もちろん、過去 7 ~ 8 年間に記述されたコードでは、List<T>代わりにを使用ArrayListする必要があり、独自の厳密に型指定されたインデクサーを使用して子孫を作成する必要はありません。

于 2012-07-27T03:25:31.460 に答える
4

これは、このクラスが基本クラスのメンバーを隠しているためです (ArrayList も同じインデクサーを定義しています)。

新規 この動作は意図されたものであり、間違いではないことをコンパイラに伝えます。

C# ポリモーフィズム ガイドを読む

基本クラスのメンバーを新しい派生メンバーに置き換えるには、new キーワードが必要です。基本クラスがメソッド、フィールド、またはプロパティを定義する場合、new キーワードを使用して、派生クラスでそのメソッド、フィールド、またはプロパティの新しい定義を作成します。new キーワードは、置き換えられるクラス メンバーの戻り値の型の前に配置されます。

于 2012-07-27T03:26:30.510 に答える
1

通常、ベースタイプがオーバーライドされるメソッドを意図している場合、それは仮想としてマークされます。その場合、サブタイプはメソッドをオーバーライドでマークするだけです。

ベースタイプがそうではなく、サブタイプが同一のメソッドを定義している場合、あいまいさが生じます。C# コンパイラは、サブタイプ メソッドを new でマークして、これが必要であることを確認するように求めます。実際には、「はい、認識しており、基本型によって提供されるメソッドを非表示にしたい」と言っています。

于 2012-07-27T03:27:40.350 に答える