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

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

Listクラスについて&ジェネリックの継承

f:id:covory10101101276:20180117111918j:image

みなさんこんにちは🌚

最近自炊をよくするブルーノです。実は炭水化物を極力取らないようにしていて、米をもう三ヶ月以上食べていません。でもそれだと意外に簡単だったので先週くらいからパン・麺・芋も縛るようにしました。一体何を目指しているんでしょうね俺は笑笑

では今回は二本立てでやって行きたいと思います。

 

Listクラス

だいぶ前にArrayListクラスについてやりました。ArrayListクラスについて(既存のクラス) - ブルーノのC#プログラミング & unity勉強日記

配列のように複数の要素を持つクラスを作るこのクラスですが実はジェネリックにもこれに似たものがあります。それがListクラスです。ジェネリックなのでこちらは明示的に型を指定することでその型として使うことができます。Listクラスのプロパティには格納されている要素の個数を表すCountや、指定のインデックスの要素を取得、設定できるItemなどがあり、関連するメソッドには、Listの末尾にオブジェクトを新たに追加できるAdd()や並び替えのSort()があります

ListクラスはSystem.Collections.Generic名前空間で定義されているのでプログラムの冒頭で宣言する必要があります。では実際にプログラムを書いてみます

f:id:covory10101101276:20180117115804p:imagef:id:covory10101101276:20180117115806p:imagef:id:covory10101101276:20180117115810p:image

2行目にusing.System.Collections.Generic; が新しく追加されているのがわかりますね。

9行目でリストの宣言をしています。実はこのリストにデータを格納する場合、実はいちいちAdd()メソッドで追加しなくてもここの段階を以下のようにするとこの行だけで初期化することができるので覚えておきましょう

List<int> i = new List<int> { 1, 10, 100....};

 

ジェネリックの継承

さて次はジェネリッククラスが継承できるのかということについてやっていきます。

通常、ジェネリッククラスは型パラメータを指定して使いますよね?この型パラメータを指定したジェネリッククラスをクローズ構築型といい、指定されていないものをオープン構築型と言います。ん?指定されてないもの?なんだそれ?ってなるので実際にプログラムを作った方が早そうです

 f:id:covory10101101276:20180117142359p:imagef:id:covory10101101276:20180117143325p:image

注目すべきは8行目で、Bruno107クラスをBruno106ジェネリッククラスから継承しています。この際Bruno106ジェネリッククラスはint型を指定してますね。これがクローズ構築型のジェネリッククラスで、普通のクラスに継承できるのはこのタイプになります。ではもう一つ見ていきます。

f:id:covory10101101276:20180117144024p:imagef:id:covory10101101276:20180117144026p:image

8行目にあるように、今度は

 Bruno110ジェネリッククラスをBruno109ジェネリッククラスから継承しています。その結果、メインメソッドでは同じBruno110クラスにそれぞれ別の型を指定して表示していますね。このように型パラメータを指定しないで通常メソッドから継承しようとした場合はコンパイルエラーになってしまいます。ところでゴリラのスペルってGorillaじゃなくてGorrilaなんですよね。びっくりしたウホ。

 

まとめてみると以下のようになります

通常クラス

通常クラス → 継承できる

クローズ構築型ジェネリッククラス → 継承できる

オープン構築型ジェネリッククラス → 継承できない

 

ジェネリッククラス

通常クラス → 継承できる

クローズ構築型ジェネリッククラス → 継承できる

オープン構築型ジェネリッククラス → 継承できる

 

触れていませんでしたがジェネリッククラスは通常のクラスからも継承できます。ん?じゃあ二つの型パラメータを持つジェネリッククラスを継承するときはどうするの?ということですが、まず通常クラスにはオープン構築型ジェネリッククラスは継承できず、全て継承元は型パラメータを明示しなければならないのであまり疑問にはなりませんね。ではジェネリッククラスの場合についてですが、両方の型パラメータを継承する場合は問題ないのですが、一部だけを継承する場合はそれ以外の部分を明示しておかなければなりません。どういうことか、それも見てもらったほうが早いですね

f:id:covory10101101276:20180117220946p:plain

f:id:covory10101101276:20180117220955p:plain

9行目のように、継承しない場合はこの時点で明示しておく必要があります。ちょっと多くなってしまいましたがここで今回は終わりにしたいと思います。

 

最近朝の寒さがあまり厳しくなくなってきて気づいたら暦の上では実は冬至を過ぎていたのを知りました。まあまだ2月も待ち受けているんですが無事今年も冬を越せそうです。