6

仮想メソッドを使用すると、メソッド/関数のデフォルトの動作が提供されることを学びました。私の質問は、派生クラスで「new」を使用して(基本クラスと同じ)同じ名前のメソッドを実装し、それをオブジェクトで個別に呼び出すことができる場合、仮想メソッドの使用はどうなるかということです。例えば;

class A
{
      public void F()
      {
         //default behavior
      }

      public virtual void G()
      {
         //default behavior
      }
}

class B:A
{
    new public void F()
     {
       //new behavior from that of class A
     }
    public override void G()
     {
      //new behavior from that of class A
     }
}

class Test
{
   public static void Main(string[] args)
     {
       //For calling A's method use same compile time and run time object
       A obj1 = new A();

       //For calling B's method use compile time object of A and run time of B
       A obj2 = new B();

       obj1.F(); //O/P is A's method result
       obj2.F(); //O/P is A's method result
       obj1.G(); //O/P is A's method result
       obj2.G(); //O/P is B's method result
}

私の質問は、クラス A と B の両方の同じコンパイル時オブジェクトと実行時オブジェクトを次のように使用して、デフォルトの動作と派生動作を提供できる場合に、クラス A の virtual G() が必要な理由です。

A obj1 = new A(); //for calling A's methods
B obj2 = new B(); //for calling B's methods
A obj3 = new B(); //for having default behavior of class A using B's run time object.

私が取得したのは、仮想の場合、同じコンパイルおよび実行時のタイプのオブジェクトをもう 1 つ作成する必要がないということだけです。タイプAのコンパイル時とタイプBの実行時の単一のオブジェクトで実現できます。

4

2 に答える 2

7

私の質問は、同じコンパイル時と実行時オブジェクトを使用してデフォルトの動作を提供し、Aのコンパイル時オブジェクトとBの実行時間を使用して派生動作を提供できるのに、クラスAの仮想G()が必要な理由です。

なぜなら、あなたはすでに知っているコードしかB使用できないからです。ポリモーフィズムの半分のポイントは、実際にどのサブクラスで動作するかを気にしないコードを記述できるようにすることです。

たとえば、仮想メソッドまたは抽象メソッドであるという理由だけで、あるストリームのコンテンツを別のストリームにコピーするメソッドStream.Readを作成できます。Stream.Writeどの実装が渡されるかは関係ありません。

メソッドモディファイアとして使用することはめったにありませnewん-非仮想メソッドに異なる動作を提供したい場合は、まったく異なるメソッド名を作成するとはるかに明確になり、コードを読む人はこれが非常に別個のメソッドであることを理解できます基本クラスで宣言されたものから。

于 2012-10-12T06:20:36.240 に答える
0

Jonは、新しい実装を非表示にすると、基本クラスのメソッドへの参照が基本実装になり、基本クラスでも呼び出しをオーバーライドすると、オーバーライドメソッドが使用されることを指摘します。

 protected virtual void Foo(){
 }

 private void Bar() {
     //do generic stuff
     Foo();
 }

クラスがfooをオーバーライドする場合、それは呼び出しバーの効果を変更します。これは、AbstractTemplateなどの特定のデザインパターンの基盤です。

于 2012-10-12T06:42:45.520 に答える