ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

型パラメータの制約について

f:id:covory10101101276:20180118113042j:image

藤園

 

みなさんこんにちは🌚

爽健美茶と玄米茶が定期的に飲みたくなるブルーノです。あんまり私は飲み物を飲まないんですがたくさん飲んだ方が健康には良いらしいですね。

さて今回はジェネリッククラスの型パラメータの制約の仕方についてまとめていきます。私は制約と聞くとクラピカを連想しますね(どうでもいい)

 

型パラメータの制約とは?

プログラムは他人にも公開したり、別の機会に一部だけ使ったりすることができるのが利点です。ジェネリッククラスでもこれを行うことはできるのですが、この型パラメータ<T>にユーザーが指定したものを勝手に指定されると不具合が起こることもあります。少なくとも自分が安全を確認したものだけを使えるようにできれば一番良いですよね。そこでこの型パラメータに制約を設けることができます。今回はwhereキーワードとnew()制約を学んでいきます。

 

whereキーワード

whereキーワードを使うと指定したクラス名型以外は型パラメータに設定できなくなります。以下の様に書きます

class ジェネリッククラス名<T> where T: クラス名

 これで型パラメータ<T>に入れられるのは「クラス名」の型のみになります。

 

new()

new()制約は先ほどのwhereと合わせて使い、これを設けるとそのジェネリッククラスの型パラメータには引数のないコンストラクタを持っている必要があるようになります。書き方としては以下の様になります

class ジェネリッククラス名<T> where T: new()

 複数の制約を組み合わせることもでき、その場合は以下の様に書きます。

class ジェネリッククラス名<T> where T: クラス名, new()

例えばこうすれば指定したクラス名にはコンストラクタが必要になります。

ではこれらを実装したプログラムを作ってみます

f:id:covory10101101276:20180119095939p:imagef:id:covory10101101276:20180119095942p:imagef:id:covory10101101276:20180119095943p:image

14行目でBruno115クラスのみを型パラメータに設定でき、なおかつそれにコンストラクタを持つように制約をかけました。new()制約をかけているおかげでで16行目ではコンストラクタを持つことが保証されているT(Bruno115クラス) をそのままインスタンス化できています。

他にも制約は色々あり、参照型のみを型パラメータにできるclassキーワード値型のみを型パラメータにできるstructキーワードなど色々あります。うまく使い分けて安全なプログラムを組める様にしたいですね。今回はここまでにしておきます。

 

プログラミングを勉強していると単純な機能拡張の仕組みと同じくらい今回のような安全性を高める仕組みが見受けられます。それほどプログラムの安全性を高めることは大切なんだなあと思いました。

ところで新年初のおみくじが吉でした。大吉に次いで良い目のはずなのに原付がパンクしたり親戚の病気が急変したり今のところ全然いいことがありません😅一年の平均が吉だとしたらこれから良いことがバンバン起こる予定なので楽しみにしてます笑