C#始めてみた。
一応CとC++とJavaとRubyの経験がある(C++はbetterC、JavaはFizzBuzz程度だが)のですぐに出来るかなと思っていたがコンストラクタの継承あたりで躓いている。
class Cicken { protected bool sex; public Cicken(bool Csex) { sex = Csex; } public void Voice() { System.Console.WriteLine("???"); } public void Sex() { if (sex) { System.Console.WriteLine("female"); } else { System.Console.WriteLine("male"); } } } class Egg : Cicken { public string state; public Egg(bool Csex) { state = "egg"; } new public void Voice() { System.Console.WriteLine("korokoro"); } } class Test { static void Main() { Cicken cicken = new Cicken(true); Egg egg = new Egg(false); cicken.Voice(); cicken.Sex(); egg.Voice(); egg.Sex(); } }
これをビルドしようとすると「'Cicken'に引数を 0 個指定できるコンストラクターがありません」というエラーが出る。
どうやら子クラスのコンストラクタ呼び出しの直前に親クラスの引数0個のコンストラクタを呼び出すかららしい。
そういう時は子クラスのコンストラクタを
Ko(int fuga) : base(fuga){ ... }
とすればいいらしい。class Cicken { protected bool sex; public Cicken(bool Csex) { sex = Csex; } public void Voice() { System.Console.WriteLine("???"); } public void Sex() { if (sex) { System.Console.WriteLine("female"); } else { System.Console.WriteLine("male"); } } } class Egg : Cicken { public string state; public Egg(bool Csex) : base(Csex) { state = "egg"; } new public void Voice() { System.Console.WriteLine("korokoro"); } } class Ocs { static void Main() { Cicken cicken = new Cicken(true); Egg egg = new Egg(false); cicken.Voice(); cicken.Sex(); egg.Voice(); egg.Sex(); } }
実行結果
??? female korokoro male
こうすると動いた。
Rubyだと親クラスにinitializeメソッドを書くだけで勝手に初期化してくれるのでC#は少し面倒だ。
まあいちいちコンストラクタを書いたりbase()と明記させることによって人に親クラス子クラスについて考えさせてくれるのかもしれない。