C#ジェネリックメソッドを作成して気づいたことなど

同一クラスを継承したいくつかのクラスにおいて共通の処理を実行したい場合、通常は素直に基底クラスにその処理を書きます。が、諸事情により、別の方法で解決したということがありましたので、その経緯と気付きを記します。

結論から言うと、ジェネリックメソッドC#)を使いました。

Aクラスという基底クラスを継承したaクラス、bクラス、cクラスがあったときに、これら3クラスで共通の処理を実行させるには、基底クラスであるAクラスにその処理を書きます。通常は。それが継承のメリットかと。

ただ、諸事情により、それが許されないケースがあり(設計方針の違いですね、、)、別の方法で解決する必要がありました。とはいえ、aクラス、bクラス、cクラスに馬鹿みたいに同じコードを書きたくはない。と、調べているうちにジェネリックメソッドに行き着きました。

ジェネリックメソッドで興味深かったのは制約。引数の型を制約できるが、その制約に基底クラスを定義できるという。まさに今回のAクラス。これでaクラス、bクラス、cクラスのいずれも型として指定できる。しかもrefで参照渡しもOK。密結合には注意が必要ですが、これはこれで柔軟性が高い。継承とジェネリックは対の関係にあるようなものなのですね。

これまで自分にとって一番なじみのあるジェネリックは、List<T>クラスの名前空間System.Collections.Genericで、「ああ、List<T>を使うときに追加しないといけないやつね」という程度でした。つまり、あまりジェネリックを意識したことはありませんでした。そのため、List<T>クラスを筆頭にジェネリッククラスをよく使うわりに、ジェネリッククラスやジェネリックメソッドを自分で実装したことがなかったという事実に今回初めて気付きました。便利だなと思って自分で使っているものがどのような仕組みでできているのかを理解することは、その便利なものを自分が作るということにもつながるので、とても大事だなと改めて気づかされました。

今回の設計方針自体が良いとは思えませんが、いつもと違うことをやってみるのもたまにはいいですね。