C#
C#でダックタイピングをしてみる
C#はC++と同じような関数テンプレート(C#は「ジェネリックメソッド」と呼ぶ)が使える。
ただ挙動はC++(静的ディスパッチ)とはまったく違い、どちらかというとJavaの挙動(動的ディスパッチ)に近い。
C++はコンパイラがメソッドを量産してオーバーロードしてくれるが、C#は受け取る型の共通の親クラスまで遡ってその型にアップキャストして受け取る、という動きになるらしい。
なので何も継承していないユーザー定義型(自分で作ったクラスのインスタンス)をジェネリックメソッドで受け取ると、object型まで遡ってしまう。
結果、受け取ったジェネリックメソッド内では引数の型情報が失われてしまっているため、受け取ったオブジェクトのフィールドやメソッドにアクセスできないという厄介な状態になる 。
「どんなオブジェクトでも何でも来い」というメソッドは作れるのだが、受け取った後は「どこに何があるのか知らんけど」となってしまうのだ。
とはいってもさすがに自分が何クラスのインスタンスなのかという情報は残っているので、is演算子で元のクラスを逐一調べてはそれぞれの型にダウンキャストしてフィールドやメソッドにアクセスすれば、なんとかダックタイピングのような処理が書ける。
素直に同名メソッドを複数書いてオーバーロードするのとどちらがマシなのかはなんとも言えない感じ。
C#は「C」の名前を冠しているが、文法がCっぽいだけで中身はJavaっぽいというか、ObjectPascalのような感じが少しする。
|