2

重複の可能性:
仮想メソッドとは?

C# では、基本クラス メソッドを仮想として宣言していなくても、メソッド シグネチャが一致すると、コンパイラは常に最新の派生クラス メソッドを呼び出します。virtual キーワードがないと、派生メソッドが呼び出されることを示す警告メッセージが表示されます (これは new キーワードを使用して削除できます)。

このキーワードがなくても、署名が一致したときに最後の派生クラスのメソッドが呼び出される場合、メソッドを仮想として宣言することの使用は何ですか。

私はここで何かを理解していません。コードを読みやすくするための「仮想」ですか? スミス

4

2 に答える 2

6

「最新の派生メソッド」についてではありません。ポリモーフィズムを使用するとどうなるかについてです。親クラスが期待されるコンテキストで派生クラスのインスタンスを使用する場合、virtual/を使用しないと、親クラスのメソッドが呼び出されますoverride

例:

class A
{
    public int GetFirstInt() { return 1; }
    public virtual int GetSecondInt() { return 2; }
}

class B : A
{
    public int GetFirstInt() { return 11; }
    public override int GetSecondInt() { return 12; }
}

A a = new A();
B b = new B();

int x = a.GetFirstInt(); // x == 1;
x = a.GetSecondInt();    // x == 2;
x = b.GetFirstInt();     // x == 11;
x = b.GetSecondInt();    // x == 12;

しかし、次の2つの方法で

public int GetFirstValue(A theA)
{
   return theA.GetFirstInt();
}

public int GetSecondValue(A theA)
{
   return theA.GetSecondInt();
}

これが起こります:

x = GetFirstValue(a);   // x == 1;
x = GetSecondValue(a);  // x == 2;
x = GetFirstValue(b);   // x == 1!!
x = GetSecondValue(b);  // x == 12
于 2012-10-02T06:50:28.477 に答える
0

仮想メソッドは再定義できます。C# 言語では、virtual キーワードは、派生クラスでオーバーライドできるメソッドを指定します。これにより、プログラムの残りの部分を変更することなく、新しい派生型を追加できます。したがって、オブジェクトの実行時のタイプによって、プログラムの動作が決まります。

詳細な例を見ることができます。

public class Base
{
  public int GetValue1()
  {
    return 1;
  }

  public virtual int GetValue2()
  {
    return 2;
  }
}

public class Derived : Base
{
  public int GetValue1()
  {
    return 11;
  }

  public override int GetValue2()
  {
     return 22;
   }
}

Base a = new A();
Base b = new B();

b.GetValue1();   // prints 1
b.GetValue2();   // prints 11 
于 2012-10-02T06:29:54.450 に答える