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

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

名前空間について

f:id:covory10101101276:20180204225015j:plain

ワイトモ洞窟

 

みなさんこんにちは🌚

缶詰の美味しさにハマっているブルーノです。安いし保存がきくし身体に良いし最高の食べ物だと思うんですよね🤩

さて今回からは少しですが名前空間についてやっていきます。今までプログラムの冒頭に書いてきたアレです。

 

名前空間

今までの全てのプログラムの冒頭にはこの記述がしてありました。

using System;

 

ジェネリックを使う時などはここにさらに別の記述を足したりもしましたね。これは一体なんなんでしょうか。このSystemという部分は名前空間と呼ばれるもので、System名前空間は今まで使っていたクラスや構造体やインターフェイスや列挙体やデリゲートなどの機能が全て詰め込まれているデフォルトの名前空間になります。名前空間は自由に作成することができ、その中で定義されたクラスや構造体などの要素はその名前空間の有するものになります。つまり、名前空間を自分で定義しておくことで、他の人が作ったプログラムの中に自分のプログラムと同じ名前のものがあったとしても見る人もコンパイラも混乱せずに済むのです。

さて、名前空間を定義するにはnamespaceキーワードを使います。名前空間で定義できるのは ・クラス ・構造体 ・インターフェース ・列挙体 ・デリゲート ・別の名前空間 です。

f:id:covory10101101276:20180204232357p:plain

f:id:covory10101101276:20180204232402p:plain

Gorilla名前空間とMonkey名前空間で同じAnimalクラスを定義していますがエラーは発生しません。名前空間名.クラス インスタンス名 でインスタンス化することができます。

 

では次に、usingについて見ていきましょう。これはusing directiveというもので、ディレクティブは、コンパイラ名前空間についての指示を設定できるものです。今までの

using 名前空間;

の他にも

using エイリアス = 名前空間名;

という使い方もできます。さて、エイリアスというワードが出てきました。エイリアス(Alias)は「別名」という意味で、その名の通り、名前空間名をエイリアスの名前で代用することができます。ここで、さっきのプログラムをちょっと書き換えてみます。

f:id:covory10101101276:20180204234109p:plain

ゴリラをディレクティブで可視化し、Bruno126クラスの中ではそのままクラス名でアクセス指定しています。モンキー名前空間にもAnimalクラスはあるのにちゃんとゴリラにアクセスできていますね。一方モンキー名前空間はMで簡略化していますね。

 

さて、最初に名前空間が定義できるものの中に「別の名前空間」とあげましたが、これは名前空間がネストできることを表します。下のプログラムを見てください

f:id:covory10101101276:20180205000505p:plain

f:id:covory10101101276:20180205000510p:plain

Donky名前空間でさっきの名前空間がネストされていますね。アクセスするときは頭からピリオドで辿ってDonkey.Gorilla.Animalのようにアクセスします。実はMonkey名前空間も同じDonkey名前空間でネストされているのもミソで、クラスの時はpartialキーワードを使わなければいけませんでしたが、名前空間の場合はそのまま使うことができます。今回はここまでにしておきます。

 

冬の空は星が一段と綺麗に見える気がします。あんな小さくてたくさん散らばっているのに一つ一つがこの星と同じものだと考えると、世界は見えるだけでも無限にあるんだなと思います。そうするとそのうちのたった一つのこの星の中ですら輝くことが難しく、自分という存在がいかにちっぽけかを考えてしまいますね。別にネガティブなわけではないですよ笑 むしろそう考えると、自分の悩みなんてそのさらに小さな心の中に引っかかっている程度のことなんだと思うし、と同時にいくらでもがむしゃらに頑張って精一杯輝いてやりたいと思えます。すいません。ネガティブではないですが、今はセンチメンタルです笑

匿名型、共変性・反変性

f:id:covory10101101276:20180203200228j:plain

ラ・ピエドラ・デル・ペニョール

 

みなさんこんにちは🌚

一日テニスコートの雪かきでヘトヘトのブルーノです。思ったよりも疲れるものなんですね雪かきって😪今回はジェネリック編ラストです。

 

匿名型

匿名というキーワードはデリゲートでも出てきましたね。

匿名メソッドとラムダ式について - ブルーノのC#プログラミング & unity勉強日記

匿名メソッドの特徴と同じように、オブジェクトを名前をつけずに作ることができます。実際に見てみましょう。

f:id:covory10101101276:20180203202841p:plain

f:id:covory10101101276:20180203202847p:plain

特に特徴もない普通のプログラムですね。結果も目に見えています。このget:setの部分は下のように簡略化できます。

f:id:covory10101101276:20180203234033p:plain

そして匿名型を使うと以下のようになります。

f:id:covory10101101276:20180203234232p:plain

すごいですね。もはや事前に準備なしで入れるものだけである程度クラスを作ってくれるんですね。

これが匿名型です(ジェネリック関係ない???)

 

ジェネリックの共変性・反変性

なんかかっこいい言葉がセットで出てきました。反変性は「はんぺんせい」ではなく「はんへんせい」だそうです。先に画像をみてもらった方が説明しやすそうです。

f:id:covory10101101276:20180203235947p:plain

f:id:covory10101101276:20180203235954p:plain

IEnumrableというキーワードが出てきましたね。これは元から実装されているクラスの一種でEnum+ableということで数値を入れることができたり、それに関する様々な目sっどを持ったクラス、ということでしょうか。このクラスにstring型をパラメータとして初めに配列を生成してます。そして次の行ですが、string型というのは、object型から派生している型です。なので、string型の配列をobject型に代入しても問題ありません。これを共変性と言います。このIEnumarableインターフェースクラスを含むいくつかのインターフェースに共変性があるので使用することができるというわけです。

そしてデリゲートFuncとActionには共変性と反変性が備わっています。Funcを使って実際にみてみましょう

f:id:covory10101101276:20180204002133p:plain

f:id:covory10101101276:20180204002647p:plain

Func デリゲートクラスはその後に<パラメータ, 戻り値>と入力することで生成したクラスに指定した戻り値を備えることができるクラスです。つまり、7行めではobject型のパラメータを持つBrunoクラスにobject型を代入しているので問題ありませんが、11行めではstring型のFuncクラスmd2にobject型のmd1クラスを代入しているのです。objectは派生元ですがその派生先であるstring型には代入できるようです。これが反変性なのです。

つまり、わかりやすくいうと、

派生先 → 派生元 への代入は共変性を持っているクラスに可能

派生元 → 派生先 への代入は反変性を持っているクラスに可能

 

ということになります。

あれ、これもジェネリック関係ない....???

とにかく、以上で今回は終わります。

 

ついにジェネリック編が終わりました。残すところも後わずか。このC#を一通り終えたら、早くUnityで実際にゲームを作り始めてみたいです!!

 

テストが終わってスマブラディシディアFF12MHWもあるのですがこっちの勉強もしたいし....あーーー時間が足りない!!

課題終わり!!

f:id:covory10101101276:20180202193508j:plain

モンサンミッシェル

 

みなさんこんにちは🌚

ついに長き戦いを終えたあ〜〜〜〜〜!どうもブルーノです。やっと私にも春が来そうですよ!!ちょっと前にこのブログをまた再開すると行っておきながら全然このところ更新できていなかったから誰に見せるわけでもないのに罪悪感がずっと心の隅にあってモヤモヤしてたんです😂

 

でもこの課題&テスト期間全く何もプログラミングの勉強をしていなかったわけではないのです!

実は今期取っていた教科の中にプログラミングの教科があって、その課題が何かゲームを作って発表するというものでした。実際に形にして発表しなければならないだけあってかなりの経験値を得ることができたように思います。言語はExcel VBAで、プログラムを学ぶ上で一つしか修めていないよりも色々な言語に精通していた方が良いと思い履修することにしたんですがこれが茨の道で😹🤮ホントに右も左も分からない状態でスタートしただけにフォームの画像を動かすことに1ヶ月くらい詰まったくらいでした。他の科目ももちろん平行でやっていましたが二ヶ月の歳月をかけて作っただけにその頑張りを認めてもらえたのかクラスの全員投票では一番をいただきました!(20人弱の超少数クラスですが笑)。

 

今回のこの経験で印象に残ったことは、プログラミングにはあまり言語とか難しい知識を有するかとかは関係ないんじゃないかってことです。VBAくらいしかまだ実践経験はありませんが、その行程では知識そのものよりも、どうやってその展開を実装しようかという仕組みを考えることに大部分を割いていました。もちろん機能の知識が豊富なら短いコードで実装できると思いますが、こんなちょっとかじっただけの知識でも根気と機転を効かせることができればできないことはないんじゃないかと思いました。

ここに作品をあげたいのは山々なんですが、内容がプライベートに結構関わっているだけにあげられないのが残念です(半分くらい作ってからこのことも考えればよかったなーと後悔しました😓特徴だけ言えばロックマンエグゼの戦闘システム丸パクリのアクションゲームです笑)

晴れてこれで春休み突入ですが、作品を作る喜びというものを今回知ったのでますますプログラミングに興味が湧いてしまいました。

よーし早くUnity作り出すぞー。体育会TV面白い

 

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

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キーワードなど色々あります。うまく使い分けて安全なプログラムを組める様にしたいですね。今回はここまでにしておきます。

 

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

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

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月も待ち受けているんですが無事今年も冬を越せそうです。

ジェネリックの基礎について

f:id:covory10101101276:20171228124905j:image

みなさんこんにちは🌚

冬休みも課題や集中講義に追われているブルーノです。課題の合間にはこのブログで息抜きがてら勉強します。まあゲームもやってるんだけどね。

冬休みにまとめきれなかったー😭

さて今回からはジェネリックというものについて勉強していきます

 

ジェネリック

名前を見ると私は黒柳徹子しか浮かびませんがこのジェネリックという概念はC#ではかなり強い(有用である)そうです。ジェネリック(generic)とは英語で「ブランドにとらわれない」とか、「一般的な」という意味で、ジェネリック医薬品は万人に効果があると証明されたものの名前だそうです。

C#でも同じで、型にとらわれないというのがこのジェネリッククラスの特徴です。

ジェネリッククラスはそのインスタンス生成時にそのメンバの型を決定します。書き方としては以下のようになります。

class MyClass<T>

{

  public T x;

  public int show(T p) {...}

}

クラス名の横やメンバの型がTというものに置き換わっていますね。このTは自分で指定したもので別のアルファベットや単語でも構わないです(一般的には大文字1文字で表されるようです)。このTを型パラメータといい以下のようにインスタンス生成して使います

MyClass<int> mc = new MyClass<int>()

この場合は上のTがint型になります。簡単にコードを書いてみます。

f:id:covory10101101276:20180110094907p:imagef:id:covory10101101276:20180110094908p:imagef:id:covory10101101276:20180110094911p:image

Bruno102クラスのメインメソッドで二つのBruno101クラスのインスタンスを生成しています。しかしその中身はそれぞれint型とstring型の別の型を代入できていますね。これこそがジェネリックの強みで、同じ設計図で型違いの物を全てひとまとめにできるのです。

型パラメータは複数取ることもできます。

f:id:covory10101101276:20180117105327p:imagef:id:covory10101101276:20180117105348p:imagef:id:covory10101101276:20180117105352p:imagef:id:covory10101101276:20180117105353p:imagef:id:covory10101101276:20180117105438p:image

少し長くなってしまいましたが二つの配列にそれぞれ番号と名前を保存し、それを表示するプログラムを組んでみました。このようにジェネリックは予め決めておいた設計図にあらゆる型を当てて柔軟に対応させることができるんですね。今回はここまでにしておきます。

 

テストに課題にとても忙しくて全然更新できてません〜〜

でも今月中にはC#の内容を一通り終えたいので頑張ります!

海鮮キムチ鍋家で作ったけどうまかった😍

 

新年度!!

f:id:covory10101101276:20180109111318j:image

みなさんあけましておめでとうございます🌅🌚

 

冬休みは忙しくてちっともブログの方が更新できていませんでした。今使っている「猫でも分かる」の本もだいぶ終盤にさしかかってきているのでこれを終わらせて新年をunityの使い方の勉強で始めたかったのですが間に合いませんでしたね😡😭スミマセン

新年の抱負をここに書き留めますがその前に自分のことについて振り返らせてください。ちょっとネガティブな入りですが....

私は昔からあまり意志が強くなく、勉強でも仕事でも苦手意識がある物はことごとく続かなかったです。楽しいことだけを追って逃げてきました。でも大学に来て、それじゃあ現実は生きて行けないんだという事を今更ですが痛感しました。親元を離れて初めて自分がいかに甘えて生きてきたかが分かりました。ああもっと嫌なことにも中高時代に取り組んでおけばよかったと典型的ですが後悔しました。

最近ようやく苦手でも自分のためにやらなきゃいけないことへの姿勢が少しづつですが付いてきた気がします。まあ今まで逃げてきた私がいきなりちょっと頑張ったところで今まで頑張ってきた人たちと同様に動けるわけもなく、中学の時の親友と年始に会った時に年末年始の勉強の話をしたらできないことはないだろと言われてしまいましたが笑

そいつは私が最も尊敬する人の一人で、中学の時の部活が一緒でした。彼は教室で見るたびに勉強していて遊びに誘っても来ることはなく、でも行事の節々は全力で楽しんでいて人付き合いが良かったです。彼は今は早稲田大学に行っており、話を聞くといずれ院にも行きたいそうです。私はときおり彼に会ってモチベーションをあげさせてもらっており、今回もまた勝手に喝を入れてもらいました。

話が逸れましたが、社会的関心と意識を持って社会性を身につけなければこの社会でできることは限られてしまうという当たり前の理をようやく自分の中で持つことができかけてきたということがこの前フリで明言しておきたいことです。

今私はヒーヒー言って必死に現実にしがみついています。そしてその中で、今までは若干現実逃避のためにプログラミングを勉強していましたが、今は本当に自分の将来のためにスキルを身に付けたいと思っています。なので今年中にアプリを作って売り出すということを今年の抱負にさせていただきます。

 

長くなってしまいましたが自分用なので今の思いを忘れないようにしたいです。

新年も頑張るぞᕦ(ò_óˇ)ᕤ