C#では継承すると、親のコンストラクタは必ず呼ばれる

(2022/2/25更新)

覚えること

  • 親のコンストラクタは必ず呼ばれる

0. 何も書かない場合

デフォルトコンストラクタが呼ばれる

public class Base {
}

public class Sub : Base {
  public Sub() {
    Debug.Log("Sub()");
  }
}

public class Main : MonoBehaviour {
  void Start() {
    Sub s = new Sub();
  }
}
// public Base() {}が自動で作られ,呼ばれている
Sub()

1. 引数なしコンストラクタのみの場合

引数なしコンストラクタが呼ばれる

public class Base {
  public Base() {
    Debug.Log("Base()");
  }
}

public class Sub : Base {
  public Sub() {
    Debug.Log("Sub()");
  }
}

public class Main : MonoBehaviour {
  void Start() {
    Sub s = new Sub();
  }
}
Base()
Sub()

2. 引数ありコンストラクタのみの場合

引数ありコンストラクタが呼ばれる

public class Base {
  public Base(int a) {
    Debug.Log($"Base(int {a})");
  }
}

public class Sub : Base {
  // 親が引数ありコンストラクタしか持たないため,
  // 必ずbase(int a)を呼び出す必要がある.
  public Sub() : base(100) { 
    Debug.Log("Sub()");
  }
}

public class Main : MonoBehaviour {
  void Start() {
    Sub s = new Sub();
  }
}
Base(int 100)
Sub()

3. 引数ありなし両方の場合

どちらかが呼ばれるようにする

public class Base {
  public Base() {
    Debug.Log("Base()");
  }

  public Base(int a) {
    Debug.Log($"Base(int {a})");
  }
}

public class Sub : Base {
  // 親の引数なしコンストラクタを呼ぶ場合
  public Sub() {
    Debug.Log("Sub()");
  }

  // 親の引数ありコンストラクタを呼ぶ場合
  public Sub() : base(100) {
    Debug.Log("Sub()");
  }
}

public class Main : MonoBehaviour {
  void Start() {
    Sub s = new Sub();
  }
}
Base() // 引数なしを呼ぶ場合
Base(int 100) // 引数ありを呼ぶ場合
Sub()

その他

UnityのAwake()やStart()は挙動が違うので注意すること

UnityのStart()の継承、オーバーライドのメモ - siunのメモ