4

私は次のコードサンプルを持っています:

public class Base
{
   public virtual void MyMethod(int param)
    {
        Console.WriteLine("Base:MyMethod - Int {0}", param);
    }
}

public class Derived1 : Base
{
    public override void MyMethod(int param)
    {
        Console.WriteLine("Derived1:MyMethod - Int {0}", param);
    }

    public void MyMethod(double param)
    {
        Console.WriteLine("Derived1:MyMethod - Double {0}", param);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Base objB = new Base();
        objB.MyMethod(5);

        Base objBD = new Derived1();
        objBD.MyMethod(5);

        Derived1 objD = new Derived1();
        objD.MyMethod(5);

        Console.ReadLine();
    }
}

上記のコードの出力は次のとおりです。

ベース:MyMethod - Int 5

Derived1:MyMethod - Int 5

Derived1:MyMethod - ダブル 5

「objD」を使用した「MyMethod」の 3 回目の呼び出しで、実際に INT を渡すときに「DOUBLE」オーバーロードが使用されるのはなぜですか。

「objBD」を使用した 2 番目の呼び出しは、正しく動作しているようです。提案してください。

4

3 に答える 3

8

奇妙なことに、私は先日の夜、ジョンとこれについて話し合っていました! 優先順位の問題があります。オーバーライドされたメソッドは基本クラスで定義されているため、「最良のメソッド」の目的では、最も具体的な型 (サブクラス)。

メソッド ( ) を再宣言した場合new、それが優先されますが、同じ型で同じ名前とシグネチャを持つメソッドを使用することはできませんoverridenewこれを実現するには、継承のレベルを追加する必要があります。

これの正確なロジックは、ECMA 334 v4 の 14.5.5 および 14.4.2 に詳述されています。

基本的に、基本メソッドを呼び出し可能にするには、基本型にキャストするか、shim メソッドを追加する必要があります。

public void MyMethod2(int param) {base.MyMethod(param);}
于 2008-12-18T11:09:32.003 に答える
0

提案どおりに次の変更を行いました。

        Derived1 objD = new Derived1();
        objD.MyMethod((int)5);

出力は変わらない

ベース:MyMethod - Int 5

Derived1:MyMethod - Int 5

Derived1:MyMethod - ダブル 5

于 2008-12-18T11:14:17.593 に答える
0

MyMethod(5) を呼び出すとき、5 は double または int である可能性があり、double の方が優先度が高いと思います。MyMethod((int)5) を呼び出してみましたか?

于 2008-12-18T10:57:55.037 に答える