7

私は2つのクラスを持っています

class  A
{
     public virtual void Metod1()
     {
         Console.WriteLine("A.Method1");
     }
}

class B : A
{
    public new void  Metod1()
    {
        Console.WriteLine("B.Method1");
    }
}

次に、これらのクラスのインスタンスを宣言し、それらのメソッドを呼び出すコードをいくつか書きます。

     static void Main(string[] args)
    {
        A a = new B();
        a.Metod1();
        B b = new B();
        b.Metod1();
        Console.ReadKey();
    }

私は次の結果を与えました:

A.Method1
B.Method1

しかし、クラス B の署名 method1 からキーワード new を削除して Main メソッドを実行すると、同じ結果が得られました。質問:メソッドの署名に new キーワードを使用するのは、読みやすさのためだけですか?

編集:新しいキーワードがないとできない場合はありますか?

4

3 に答える 3

7

newキーワードにより、コード リーダーは、このメソッドがベースに同じ名前を持つメソッドを非表示にすることを認識できます。省略してもコンパイラは同じように扱いますが、警告が表示されます。

メソッドをvirtualとして宣言したため、コンパイル時に次の警告が表示されます。

「B.Metod1()」は、継承されたメンバー「A.Metod1()」を非表示にします。現在のメンバーでその実装をオーバーライドするには、override キーワードを追加します。それ以外の場合は、新しいキーワードを追加してください。

ただし、仮想を削除して宣言を変更すると、次のようになります。

  • virtual inなしの宣言A

    class A {
        public void Metod1() {
            Console.WriteLine("A.Method1");
        }
    }
    
    class B: A {
        public void Metod1() {
            Console.WriteLine("B.Method1");
        }
    }
    

それでもコンパイルされますが、警告メッセージは次のようになります。

「B.Metod1()」は、継承されたメンバー「A.Metod1()」を非表示にします。非表示が意図されている場合は、new キーワードを使用します。

上記のいずれかの方法で、次のようになります。

  • テストコード

    var b=new B();
    b.Metod1();
    (b as A).Metod1();
    

出力します:

B.方法1
A.方法1

ただし、次のように宣言すると、次のようになります。

  • オーバーライドを含む宣言B

    class A {
        public virtual void Metod1() {
            Console.WriteLine("A.Method1");
        }
    }
    
    class B: A {
        public override void Metod1() {
            Console.WriteLine("B.Method1");
        }
    }
    

出力は次のようになります。

B.方法1
B.方法1

これはMethod1、基本クラスが隠されているだけでなく、派生クラスによってオーバーライドされているためです。

newだけを使用できないケースは、ifが抽象クラスの抽象メソッドである場合です。Method1

  • 派生クラスでオーバーライドを使用する必要があるコード

    abstract class A {
        public abstract void Metod1();
    }
    
    class B: A {
        public override void Metod1() { // use `new` instead of `override` would not compile
            Console.WriteLine("B.Method1");
        }
    }
    

この場合、派生クラスをオーバーライドする必要があるため、単にnewを使用することはできません。AMethod1

于 2013-04-04T06:30:10.810 に答える
6

Override および New キーワードをいつ使用するかを知る (C# プログラミング ガイド)

C# では、派生クラスのメソッドは基本クラスのメソッドと同じ名前を持つことができます。new キーワードと override キーワードを使用して、メソッドがどのように対話するかを指定できます。override 修飾子は基本クラス メソッドを拡張し、new 修飾子はそれを非表示にします。

また

new を使用することで、それが変更するメンバーが基本クラスから継承されたメンバーを隠していることを認識していることを主張しています。

于 2013-04-04T06:28:25.787 に答える
3

はい、その通りです。この状況で読みやすくするためです。

ただし、基本メソッドを非表示にするときに new を使用しないという警告が表示されるはずです。

ここで詳細を読むことができます: http://msdn.microsoft.com/en-us/library/vstudio/435f1dw2.aspx

于 2013-04-04T06:30:53.097 に答える