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

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

構造体2

f:id:covory10101101276:20171026103218j:image

みなさんこんにちは🌚

 台風の土日をずっと家で引きこもっていたブルーノです。珍しくずっと家で寝てたなー。あんまり気分が上がらなかったからか。さて前回、構造体とはどんなものかを大まかにやりました。そのまとめは容量の少ないクラスなら構造体にした方が素早くアクセスでき、効率的、というものでした。ではクラスを作成した時に「これなら構造体にした方が良くないか?」と思うことができるように、クラスでも構造体でもできることについて微妙な違いも一緒にまとめたいと思います。

 

静的メンバ

構造体も静的メンバを扱うことができます。静的メンバは各インスタンス間で共有できる変わらない値をクラス内で扱う際、インスタンス化せずにいきなりアクセスできるメンバのことですね(この説明では不十分かもしれませんが...)。

f:id:covory10101101276:20171030143750p:imagef:id:covory10101101276:20171030143753p:image

上の画像にあるようにBruno055構造体のメンバに全てstaticキーワードが付いており、それ故にBruno056クラスではBruno055構造体をインスタンス化せずに直接メンバを呼び出しています。

 

コンストラクタを持つ構造体

構造体もまた、newキーワードでインスタンス化するとコンストラクタが呼び出されます。自作のコンストラクタがない場合はデフォルトコンストラクタが呼び出されますが、構造体の自作のコンストラクタを呼び出す場合はパラメータリスト(引数)が必要になります。下に例を示します。

f:id:covory10101101276:20171030165530p:imagef:id:covory10101101276:20171030165533p:image

この中で特筆すべき点は主に2点あり、一つがまず7行目のBruno057構造体の自作コンストラクタで、パラメータリストを用意しています。ここに何も入っていないとエラーとなります。

そしてもう一つが17行目で、Bruno057構造体をインスタンス化する際に引数を入力していませんがエラーになりません。この場合インスタンスは0で初期化されることを覚えておきましょう。引数は必要だが呼び出す際に引数はなくても良い。中々便利なのかめんどくさいのか分からないです。

 

インターフェイスの実装

構造体でも、newキーワードを使ってインスタンス化すればインターフェイスを実装できます。

f:id:covory10101101276:20171031055451p:plain

f:id:covory10101101276:20171031055458p:plain

ちゃんとBruno060クラスがBruno059インターフェイスを実装できていますね 。あと、36行めでもしnewキーワードを使わずに

Bruno060 b;

とだけ宣言した場合はエラーとなってしまいます。今回はこのあたりにしておきます。

 

最近新しく知ったBURNOUT SYNDROMESというアーティストにはまっています。そこから芋づる式にハイスコアガールという漫画も知って一気買いしてしまいました。なんか版権とかがいろいろ大変みたいですが続きが読みたいですね😑😑 

構造体

f:id:covory10101101276:20171024115054j:image

みなさんこんにちは🌚

宇宙から見たオーロラをテレビで見てとても感動したブルーノです。いつか気楽に宇宙旅行できてこの光景がただのSNS映えのバックとして投稿される未来が来るんでしょうか。キレイやなあ😍😍

さて今回からは構造体についてまとめていきたいと思います

 

構造体について

 今までクラスについてのみ扱ってきましたが実はクラスに似たものに構造体という概念があります。クラスとの違いとしてはいろいろありますが大きな違いはクラス参照型であるのに対し構造体値型であるということです。参照型・値型というワードは一番最初の型についてをやった時やref・out参照の時にやったことがあるのですがちょっとあやふやですね。

値型...それぞれの値が数値を持つ

参照型...それぞれの値に参照アドレスを持つ

これはつまりどういうことかというと例えば値を変更する際に

  • 値型の場合は宣言した値分だけデータを作るために容量が大きいアクセスは早い
  • 逆に参照型は宣言した値にあるのは大元のデータの在り処だけなので容量は小さいがアクセスする際にいちいち探しに行くので少しアクセスは遅くなる

という事です。それ以外の点ではクラスの方ができることの方が基本的に多いので構造体の用途としては少ないデータを扱う際に用いることでうまく効率化できるという旨がマイクロソフトのサイトの方にも載っていました。では、クラスとの違いを表すための簡単なプログラムを組んでみます。

f:id:covory10101101276:20171025070937p:plain

この画像は実行不可なプログラムです。注意書きにもあるようにクラスの時はおなじみだった

public int x = 7;

等の初期化子を使ってインスタンス変数を初期化するということができないのです。この場合はちゃんと分けて

f:id:covory10101101276:20171025071359p:plain

f:id:covory10101101276:20171025071406p:plain

のように入力しなければなりません。これが一応際立った違いのようです。

とりあえず今回はここまでにしておきます。

 

バイトでバーの運営をこの前手伝ったのですがスパークリングワインとシャンパンは違うものなんですね。初めて知りました。他にも大学生の私では普段手が出せないようなメニューも扱っていてとても新鮮でした。当然ですが良いお酒は美味しいんですねやっぱり😌

 

 

インターフェースの継承

f:id:covory10101101276:20171020111147j:image

みなさんこんにちは🌚

サンシャイン池崎サンドウィッチマン、我が家、ロバートがお笑いではお気に入りのブルーノです。大体狂ったキャラのお笑いが好きなんですね😅

さて今回はインターフェースの継承についてです

 

インターフェースもクラスと同様に継承することができます。この場合、継承したインターフェースをクラスで用いた場合は継承元も全て実装しなければいけません。

f:id:covory10101101276:20171020201840p:plain

f:id:covory10101101276:20171020201902p:plain

f:id:covory10101101276:20171020201905p:plain

IBruno049インターフェイスとIBruno050インターフェイスでデータや合計、平均を実装することを約束させ、Bruno051クラスで実装しています。なおこの時(15行目)に継承元をIBruno050しか書いていませんが、ちゃんとIBruno049も継承されています。なお、この時IBruno049のメンバを実装しなければエラーになります。今回はここまでにしておきます。

 

最近はスマホの普及でアプリの幅もジャンルもたくさん増えてきてびっくりするような興味深いものもたくさん出ています。最近はそういったアプリの構成がどんな風になっているのか考えるのが楽しいです。まだ全然作り方はわかりませんが笑

インターフェースの実装について

f:id:covory10101101276:20171013093226j:image

みなさんこんにちは🌚

秋が来ているはずなのに雨続きでうまく紅葉を楽しめませんブルーノです😓まあ雨が滴る紅葉もキレイですけどね笑

さて今回からはインターフェースについてやって行こうと思います

インターフェースについて

インターフェースとは、前回やった抽象クラスに似ており、その特性をより拡張したものとも言えます。

インターフェースの宣言はinterfaceキーワードを使って行います。

interface インターフェース名

{

    抽象メンバ

    ....

}

抽象メンバとは、前回抽象クラスでやったように何も実装されていないメソッドプロパティインデクサのことを指します。

インターフェースをクラスに実装するには、クラスの継承のように「:」を使ってどのインターフェースを使うかを明示します。派生クラスにインターフェースを実行させたい場合は基本クラスを先に書きます

例)

・class クラス名 : インターフェース

・class 派生クラス名 : 基本クラス名, インターフェース

では実際にやってみます。

f:id:covory10101101276:20171013105840p:imagef:id:covory10101101276:20171013105844p:imagef:id:covory10101101276:20171013105845p:image

全てのメンバを実装し、検証してみました。14行目までのインターフェースで宣言しているのは

・仮装メソッド(show)

・仮想プロパティ(prop)

・仮想インデクサ

と言います。最後のインデクサは142857というある数字にいろんな一桁の整数をかけているのですがこれが面白くて、1~6までの数字をこの数にかけるとどれも「142857」という数字が繰り返しているのです。そして7をかけると999999になります8, 9もなんかそれっぽい数字になるという面白い数なのです🤣今回はここまでにしておきます。

 

プログラミングの中には様々な英単語がキーワードとして出て来ます。英語が得意だとプログラミングも学習しやすいと思います。じゃあ外国人は スラスラできるのかな?周りみんなTOEICやってるからやろうかな〜🤔🤔

 

 

クラスやメソッドの分割定義

f:id:covory10101101276:20171012224418j:plain

みなさんこんにちは🌚

YouTubeでSASUKEの動画を見つけてみてたら時間が経つのも忘れて見入ってしまいましたブルーノです😃昔はよくやってた気もしますが最近は全然見かけなくなりましたね。またやってくれればいいのにな〜。さて今回は分割定義についてです。

分割定義について

C#ではクラスやメソッドの頭にpartialキーワードをつけることで定義を分割することができます。例で表すとこんな感じです。

例)partialクラス

partial class Bruno

{

    int x;

}

partia class Bruno

{

    x = 7;

}

 

 

これでそれぞれの中括弧{ }の中には一つの要素しかありませんが2つ目のx = 7はちゃんと一つ目のint xに格納されています。

例)partialメソッド

partial class Bruno

{

    public static void Main()

    {

        Bruno b = new Bruno();

        b.Show();

    }

    partial void Show();

}

partial class Bruno

{

    partial void Show() {

    Console.WriteLine("いえーい");

    }

}

 

パーシャルメソッドも同様別の括弧内で定義することでそれ以外の括弧内で同様の要素を使用することができます。しかし注意しなければならないことがあり、partialメソッドの戻り値はvoidで、アクセス修飾子はprivate出なければなりません。また、パーシャルメソッドの宣言と定義はそのパーシャルクラス内でなければなりません。つまりパーシャルメソッドを使いたい場合は必然的にパーシャルメソッドも使うことになります。

このパーシャルクラスたちは、個人のみで使うプログラムの場合はあまり意味がありません。しかしプロジェクトによっては複数人、もしリリースするならカスタマーを含め大量の人が目にする場合があります。そんな時、あるクラスの中に追記できるようにしたいが既存のプログラムは残しておきたい、もしくは見た目が複雑で邪魔だという時に、見えないところでこのパーシャルクラスを作り実装しておくそうです。partialキーワードがついている場合は必ずしも全てがその括弧内に収まっているとは限らないのです。今回はここまでにしておきます。

 

最近インド映画の「きっとうまくいく」をみました。インド映画特有のノリとテンポの良さが詰め込まれていて観ていて元気が湧いてきました😋これぐらい前向きに毎日を生きていきたいです笑

abstract(抽象)クラス

f:id:covory10101101276:20171011083719j:plain

みなさんこんにちは🌚

朝は空気が澄んでいてとてもランニングしやすいです。起きるのは大変ですがちょっと早起きして外にくりだしてみると案外気持ちいいですよ笑

さて今回はのちにやるインターフェースというものに似ている抽象クラスについてまとめます。

抽象クラスについて

今までは基本クラスである程度設計図を作り、派生クラスで少し変更を加える形ばかりを取っていましたが、基本クラスでなんの具体的なデータも入れずとりあえずの雛形だけ作って、派生クラスでその実装を行いたい場合も出てきます。そんな時は基本クラス内でabstractキーワードを使うことで抽象メソッドを作ることができます。そして抽象メソッドを含むクラスを抽象クラスと言います。

抽象クラスと抽象メソッドの例)

abstract class クラス名

{

    abstract 返すデータ型 メソッド名(パラメータリスト);

}

ちなみに派生クラスではこの抽象メソッドの中身を全て実装する必要があります。

f:id:covory10101101276:20171012110800p:imagef:id:covory10101101276:20171012110804p:imagef:id:covory10101101276:20171012110807p:image

長い文を書いてしまいましたが、要点は3〜11行目で、設けた抽象クラスを実装し、3つの数の最大公約数を求めるクラスを作ってみました。だいぶ無駄が多いプログラムだと思うのでどなたかご指摘お願いいたします😅😅今回はここまでにしておきます

 

この先にやるインターフェースという概念にとても似ているこの抽象クラス。これらの違いについても明確にして行こうと思います🙂🙃

 

クラスの多層階層とコンストラクタの継承

f:id:covory10101101276:20171010222543j:plain

みなさんこんにちは🌚

FF15を振り返るとやっぱりグラフィックや音楽・演出などが素晴らしいです。モチーフとなったベネツィアの写真を見ると思ってたよりオルティシエでした笑

いつか死ぬ前に一度は訪れてみたいです 

 

さて今回はクラスの多層階層についてまとめていこうと思います。その名の通り多層に渡って継承をするのですがここまで継承をわかっている人ならなんとなくどんな感じになるか察しているんじゃないかなとも思います🙄

多層階層について

基本クラスから派生させた派生クラスを基本クラスとして、さらに派生させることもできます。

f:id:covory10101101276:20171011050907p:plain

f:id:covory10101101276:20171011050912p:plain

Bruno039クラスで各基本クラスと派生クラスのインスタンスを生成しています。最初のb1 = b2 の代入は予想通りshowクラスがオーバーライドされています。次のb1 = b3の代入はいきなり基本クラスに派生の派生であるBruno039クラスのインスタンスを代入していますが結果はみてわかるようにちゃんと間のBruno038クラスも継承されています。では次に、コンストラクタを景初した場合の処理についてまとめます。

 

コンストラクタの継承について

コンストラクタクラスと同じ名前を持つメソッドのことを指し、そのクラスの中で一番最初に実行され主にそのクラスの初期化に使われるものでしたね。このコンストラクタは先ほどのように継承されるとどうなるのでしょうか

f:id:covory10101101276:20171011055615p:plain

f:id:covory10101101276:20171011055619p:plain

継承されるたびにその派生クラスのコンストラクタが呼び出されていることが確認できますね。今回は少し短いですがここまでにします。

 

急に朝が寒くなったような気がします。もう半袖の人は全然見かけません。ゲーム製作に取り付ける日は来るのだろうか....