126
class Person
{
    public int age;
    public Person()
    {
        age = 1;
    }
}

class Customer : Person
{
    public Customer()
    {
        age += 1;
    }
}

Customer customer = new Customer();

お客様の年齢は2歳ですか?何があっても基本クラスのコンストラクターが呼び出されるようです。もしそうなら、なぜbase最後に電話する必要があるのでしょうか?

public Customer() : base()
{
    .............
}
4

7 に答える 7

115

これは単に C# が機能する方法です。型階層内の各型のコンストラクターは、Most Base -> Most Derived の順に呼び出されます。

したがって、特定のインスタンスではPerson()、 を呼び出してからCustomer()、コンストラクターの順序で呼び出します。コンストラクターを使用する必要がある場合がある理由baseは、現在の型より下のコンストラクターに追加のパラメーターが必要な場合です。例えば:

public class Base
{
     public int SomeNumber { get; set; }

     public Base(int someNumber)
     {
         SomeNumber = someNumber;
     }
}

public class AlwaysThreeDerived : Base
{
    public AlwaysThreeDerived()
       : base(3)
    {
    }
}

AlwaysThreeDerivedオブジェクトを構築するために、パラメータなしのコンストラクタがあります。ただし、Baseタイプはそうではありません。したがって、パラメーターのないコンストラクターを作成するには、基本コンストラクターに引数を提供する必要があります。これは、base実装で行うことができます。

于 2012-10-31T19:20:48.833 に答える
65

はい、基本クラスのコンストラクターが自動的に呼び出されます。base()引数のないコンストラクターがある場合は、明示的な呼び出しを追加する必要はありません。

建設後に顧客の年齢を印刷することで、これを簡単にテストできます (デモ付きの ideone へのリンク)。

于 2012-10-31T19:18:01.527 に答える
16

デフォルトのパラメーターなしのコンストラクターがない場合は、パラメーター付きのコンストラクターを呼び出す必要があります。

class Person
{
    public Person(string random)
    {

    }
}

class Customer : Person
{
    public Customer(string random) : base (random)
    {

    }
}
于 2012-10-31T19:21:34.950 に答える