2011-11-08 11 views
1
class clsTestParent 
    { 
     public void testNoAbstract() 
     { 
      Console.WriteLine("Parent Method Call"); 
     } 
    } 

    class clsDerivedTest : clsTestParent 
    { 
    public void testNoAbstract() 
     { 
      Console.WriteLine("Child Method Hiding Parent Method"); 
     } 
    } 

      clsTestParent objParent = new clsTestParent(); 
      clsTestParent objOfParentFromDerived = new clsDerivedTest(); 
      clsDerivedTest objDerived = new clsDerivedTest(); 

      objParent.testNoAbstract(); 
      objOfParentFromDerived.testNoAbstract(); 
      objDerived.testNoAbstract(); 

出力:
親メソッド呼び出し
親メソッド呼び出し
託児方法隠す親メソッドは、なぜ私は、派生クラスでそれを隠すことができたときに仮想メソッドを宣言する必要があります

しかし、私がtestNoAbstract()を派生クラスの仮想とオーバーライドとして宣言すると、出力は以下のようになります。

Parent Method Call 
Child Method Hiding Parent Method 
Child Method Hiding Parent Method 

私は思っていましたが、派生クラスのメソッドを再定義できるのは、abstractまたはvirtualと定義されていますが、これから分かるように、派生クラスで再定義するだけで親クラスメソッドを非表示にできます。

コードを変更することで出力の違いがわかりますが、私が知りたいのですが、上記の2つの方法の違いは何ですか?

答えて

3

あなたは今までclsTestParent a = new clsDerivedTest()を実行しています - あなたはclsDerivedTestクラスでその1つを実行することはできません!!!!

コンパイラがあなたに警告する理由と違いです。

多態性アーキテクチャーを実行する場合は、実際にこれを実行します。

マイクロソフトではを教えてくれます:「聞いて、あなたはクラスを批判しました。私たちはすべての公的なものなどを提供しますが、方法を実装する方法はわかりません...仮想+オーバーライド - あなたはinstace型で別のメソッドを実行できるようになります。オーバーライドしないと、父親の機能が常に実行されます...あなたの選択...私たちはあなたに警告しています...彼らは警告します

2

これは「再定義」がそれのために幾分悪い言葉である理由です。 - 、としないように

clsTestParent objOfParentFromDerived = new clsDerivedTest(); 
    objOfParentFromDerived.testAbstractOrVirtual(); // marked as virtual or abstract in base class 

とコールがobjOfParentFromDerivedが本当に(clsDerivedTestnewオペレータ)であることをクラスで定義されたメソッドに、実行時に解決されました:仮想呼び出しは、あなたにできた理由です、あなたのタイプのランタイムを解決しますこのメソッドは、(clsTestParent)で宣言されたクラスで定義されています。

virtualまたはabstractと表示されていない場合は、変数が宣言された型に基づいて呼び出しが解決されるため、コンパイラは警告します。

関連する問題