1

すべての拳、私は使用virtualしますoverride

たとえば、基本クラス A には methodA.do()があり、継承されたクラス B にはB.do()A をオーバーライドするメソッドがあります。

を呼び出すと(B as A).do()、どちらdo()が実行されますか?

または、メソッドがある場合はvoid mymethod(A a) {a.do()}、今それを呼び出すと、B b; mymethod(b)実行されb.do()ますか?

4

4 に答える 4

3

最上位のオーバーライド メソッドが常に呼び出されます。つまりb.Do()、 or または(b as A).Do()or((A)b).Do()が呼び出されますB.Do()

子クラスがそれをオーバーライドする場合、子クラスから基本メソッドを呼び出す方法がわかりません。

于 2011-09-18T10:43:29.717 に答える
2
public class A
{
    public virtual void Do() { Console.Write("a"); }
    public void Do2() { Console.Write("a2"); }
}

public class B : A
{
    public override void Do() { Console.Write("b"); }
    public new void Do2() { Console.Write("b2"); }
}

class Program
{
    static void Main(string[] args)
    {
        B b = new B();
        A a = b;
        b.Do();               //b
        ( b as A ).Do();      //b
        a.Do();               //b
        ( (A)b ).Do();        //b

        ( b as A ).Do2();     //a2
        ( (A)b ).Do2();       //a2
        ( b ).Do2();          //b2
    }
}  

出力:

b b b b
a2 a2 b2
于 2011-09-18T10:45:20.913 に答える
1

do() メソッドが virtual と宣言されているかどうかに完全に依存します。仮想でない場合は、A.do() が呼び出されます。仮想の場合、B.do() が呼び出されます。これは、多態性を可能にし、参照の型に関係なくメソッドを呼び出すことを可能にするvirtualキーワードです。

C# には、B オブジェクト参照から仮想 A.do() メソッドを直接呼び出すことができるメカニズムはありません。唯一の例外は、クラス B のインスタンス メソッド内で base.do() を使用することです。

于 2011-09-18T10:53:40.707 に答える
1
public class A
{
    public A() { }
    public void Do() { Console.Write("A"); }

}

public class B : A
{
    public B() { }
    public void Do() { Console.Write("B");  }
}

class Program
{
    static void Main(string[] args)
    {
        B b = new B();
        b.Do(); //<-- outputs B
        (b as A).Do(); //<-- outputs A
      }
}

コンパイラは、オーバーライドではなく非表示について 警告します:

警告 1 'ConsoleApplication5.B.Do()' は、継承されたメンバー 'ConsoleApplication5.A.Do()' を非表示にします。非表示が意図されている場合は、new キーワードを使用します。c:\Program.cs 18 21 ConsoleApplication5

that is since you are not overriding anything, but simply hiding the method from A.

however

public class A
{
    public A() { }
    public virtual void Do() { Console.Write("A"); }

}

public class B : A
{
    public B() { }
    public  override void Do() { Console.Write("B");  }
}

calls B twice, when method is overridden.

于 2011-09-18T10:56:31.050 に答える