非静的構造関数ノート

5696 ワード

(1)パラメータなしのコンストラクション関数をデフォルトコンストラクション関数と呼びます.new演算子を使用してオブジェクトをインスタンス化し、newにパラメータを指定しない限り、デフォルトコンストラクション関数が呼び出されます.
/***********************************************************************
 *           
************************************************************************/
using System;
class A
{
    public A() { }//   ,       
}
class C
{
    static void Main(string[] args)
    {
    //  ,      A(),   A    
        A a = new A();
    }
}

(2)派生クラスは呼び出しベースクラスのコンストラクション関数を表示することができる.ユーザは呼び出しコンストラクション関数を表示できない.
/***********************************************************************
 *                 。             
************************************************************************/
using System;
class A
{
    public A() { }
}
class B:A 
{
    public B():base (){}//           
}
class C
{
    static void Main(string[] args)
    {
        A a = new A();
        //  ,            。                      。 
        a.A();
    }
}

(3)ベースクラスのコンストラクタを先に実行し,派生クラスのコンストラクタを実行する.
/*********************************************************************** 
 *          A     ,  B      
************************************************************************/
using System;
class A
{
    public A() { Console.WriteLine("  A     "); }  
}
class B:A 
{
    public B() { Console.WriteLine("  B     ");  }
}
class C
{
    static void Main(string[] args)
    {        
       B b = new B ();        
    }
}

(4)派生クラスでbaseキーを使用してベースクラスコンストラクタを明示的に呼び出さないと、デフォルトコンストラクタ(ある場合)が暗黙的に呼び出されます.

/***********************************************************************
 *      ,      base               ,            。 
************************************************************************/
using System;
class A
{
    public A() { Console.WriteLine("  A     "); }
    public A(int i) { Console.WriteLine("  A       "); }
}
class B:A 
{
    public B() { Console.WriteLine("  B     ");  }
}
class C
{
    static void Main(string[] args)
    {
        //   B ,      A     。     A       ,   B     
       B b = new B ();        
    }
}

(5)ベースクラスに独自に書かれたコンストラクタがある場合、システムはベースクラスのデフォルトのコンストラクタを呼び出すことはありません.派生クラスに明示的に指定されたベースクラスのコンストラクタがない場合、エラーが発生します.ベースクラスにベースクラスのデフォルトのコンストラクタを追加する必要があります.


/***********************************************************************
 *   A            (             ),
 *    B     A     ,         A       ,   
 *   。(  :A    0        )
 * 
************************************************************************/
using System;
class A
{    
    public A(int i) { Console.WriteLine("  A       "); }
}
class B:A 
{
    public B() { Console.WriteLine("  B     ");  }
}
class C
{
    static void Main(string[] args)
    {
        //  ,A    0        
       B b = new B ();        
    }
}


/*********************************************************************** 
 *    B      A     ,    
************************************************************************/
using System;
class A
{    
    public A(int i) { Console.WriteLine("  A       "); }
}
class B:A 
{
    public B() :base(1) { Console.WriteLine("  B     ");  }
}
class C
{
    static void Main(string[] args)
    {
        //   B      A     ,    
       B b = new B ();        
    }
}

/*********************************************************************** 
 *                            ,    
************************************************************************/
using System;
class A
{
    public A() { Console.WriteLine("  A     "); }
    public A(int i) { Console.WriteLine("  A       "); }
}
class B:A 
{
    public B() { Console.WriteLine("  B     ");  }
}
class C
{
    static void Main(string[] args)
    {
        //   B      A     ,             ,    
       B b = new B ();        
    }
}

親のコンストラクション関数を初期化してから継承クラスのコンストラクション関数を呼び出し、継承クラスに親のコンストラクション関数が指定されていない場合は、デフォルトで親にパラメータのないコンストラクション関数を呼び出し、継承クラスのコンストラクション関数を呼び出すことができます.
(6)コンストラクタはthisキーを使用して同じオブジェクト内の別のコンストラクタを呼び出すことができる

/*********************************************************************** 
 *   this               
************************************************************************/
using System;
class A
{
    public A():this("abc") { Console.WriteLine("  A        "); }
    public A(string s) { Console.WriteLine("  A          "); }  
}
class B:A 
{
    public B() { Console.WriteLine("  B     ");  }
}
class C
{
    static void Main(string[] args)
    {
        //   A           ,   A         ,    B     
       B b = new B ();        
    }
}