4

重複の可能性:
オーバーライドされたメソッドの C# オプション パラメータ

using System;
namespace Apple
{
    class A
    { 
        public virtual void Func(int a=4){
            Console.WriteLine(" A Class: "+a);
        }
    }
    class B : A
    {
        public override void Func(int a = 12)
        {
            Console.WriteLine(" B Class: "+ a);
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            A ob = new B();
            ob.Func();
            Console.ReadLine();
        }
    }
}
// Output: B Class: 4
4

4 に答える 4

2

デフォルトのパラメーターはコンパイル時に入力され、コードobは基本クラスを介して変数を参照します。仮想メソッドのオーバーライドは、期待どおりに実行時に機能します。メソッドのオーバーロードを使用して、目的の効果を得ることができます。

class A 
{
   public void Func(int value) 
   {

   }

   public virtual void Func() 
   {
        Func(4);
   }
}

class B: A
{
   public override void Func() 
   {
        Func(12);
   }
}
于 2012-12-27T06:14:38.503 に答える
1

コンパイラは、オブジェクトの型に基づいて既定のパラメーター値を配置し、コンパイル時に実行されます。
したがって、コンパイルされたコードは次のようになります。

using System;
namespace Apple
{
    public class Program
    {
        private static void Main(string[] args)
        {
            A ob = new B();
            ob.Func(4);
            Console.ReadLine();
        }
    }
}


これを行うことで、目的の結果を得ることができます。

public class Program
    {
        static void Main(string[] args)
        {
            A ob = new B();
            ((B)ob).Func();
            Console.ReadLine();
        }
    }
于 2012-12-27T06:15:33.297 に答える
0

クラスBのアドレスを参照しているクラスAのインスタンスを作成しているためです。

A ob = new B();

インスタンスはクラス A のものなので、呼び出すメソッドはクラス A のメソッドを指しています。debug を入れてコードを実行することでこれを確認できます。

代わりに、クラス B ie のインスタンスを作成する場合

B ob = new B();

クラス B からメソッド Fun() を呼び出し、出力を " B Class: 12" として表示します。

于 2012-12-27T06:09:54.943 に答える
0

デフォルトのパラメーター値は静的バインディングです。

于 2012-12-27T06:15:30.350 に答える