拡張メソッドあれこれ

はいどーもこんばんは人生を拡張していきたい無職です。
本日は拡張メソッドについて学んだことをまとめたいと思います。
なお拡張メソッドについては去年の12月に「使ってみた」的な記事を上げています。

C#の拡張メソッドについて勉強してみる
はいどーもこんにちは風邪が治らないニート(希望はプログラマ)です。 本日は「拡張メソッド」について勉強していきたいと思います。 拡張メソッドとはなんぞ 拡張メソッドの概要についてはC#プログラミングガイドを参照しましょう。 C#...
「拡張メソッドなんて言葉しか知らんよ」という方は先に上記の記事を読んでいただいた方がよいのではないでしょーか。

インターフェイスに拡張メソッドを生やす

拡張メソッドと言えば「こちらが内部をいじれない既存のクラスを拡張する際に使用するもの」というイメージをお持ちの方もいるのではないでしょーか。
僕も今まで拡張メソッドはその程度の認識だったので「実際に書くコードで使うことってあんまりなさそうだなあ。だって別に既存のクラスに機能を追加したいって思うようなもの作ったことないし……」なんて思っていました。
ところがどっこい、拡張メソッドはインターフェイスにも生やせるというではありませんか!
というわけで早速サンプルコードをドン。

この機能にインターフェイスを使う必要があるのかどうかはともかく、何をやっているのかはわかっていただけるかと思います。
大事なのはCountExtensionsクラスですね。
ここでICountインターフェイスに対して拡張メソッドを生やしています。

Counterクラスを使う側のコードとしてはこんな感じ。

何が嬉しいのか?

で、インターフェイスに拡張メソッドを生やせると何が嬉しいのでしょうか?
例えば色々なクラスにICountインターフェイスを実装するとします。
そのとき、ほぼ共通して使うような実装があるとします。
インターフェイスは実装を持てないので、各クラスでコードをしこしこ書いていく必要があります。
ですがそんなこと面倒なのでしたくないですよね。
かといって抽象クラスにするのはちょっと……という場合に拡張メソッドが活躍するわけですね。
いやあ、これはからは拡張メソッドちょっと使っていけそうです!

構築された型に対して拡張メソッドを生やす

お次は「構築された型」に対して拡張メソッドを生やしてみたいと思います。
「構築された型」って一体なんやねんということですが、例えば

だったり

だったり、具体的な型がはめられたアレです。
例えば以下のようなクラスとインターフェイスがあったとします(ここではListに入れられるものならなんでもよいので、中身はすごい適当です)。

そして別の場所でそれぞれのクラスのインスタンスを作成します。
例えばこんな感じ。

このときモスラクラスを格納しているリストに対し、全ての要素の数だけSpawnして新しいゴジラクラスのリストを作成したい場合があるとします(この機能はゴジラクラスには不要とする)。
そんなときに拡張メソッドです!

こちらを用いると、全ての要素の数だけSpawnして新しいゴジラクラスのリスト(IEnumerable<Godzilla>型)を作成します。
利用する側のコードはこんな感じ。

見れば一発でわかる通り、mosListに新しいモスラのインスタンスを3つ追加しています。
なのでリストの長さは3です。
SpawnGozillasを呼ぶと、ゴジラが3匹入ったリストが返ってきます。

また、SpawnGozillasを呼べるのはList<Mothra>型のみです。
List<int>やList<Godzilla>からは呼べません。

なお変数名はgodziListとなっていますが、実際にはIEnumerable<Godzilla>です。
ListにするならToListメソッドを呼ぶ必要があります。

終わりに

今まで拡張メソッドはそんなに利用したことがありませんでした(もちろん既存のライブラリで定義されているものはよく使っていますが)。
これからは使えそうな場面では積極的に利用していこうかなあと思いますよ。

あとジェネリック型についても勉強し直しているのですが、これはかなり奥が深いですね……。
もう少し理解が深まったら何か記事あげようかなあ、なんて思っています(予定は未定)。

ほなそんな感じでまた。

フォローする