忍者ブログ

ゲーム作成状況を載せて行きますよ。 いつ完成する事やら・・・
12 2017/011 2 3 4 6 78 9 11 12 13 1415 17 18 19 20 2122 23 24 25 26 27 2829 30 31 02

01.16.15:11

ダウンキャストを使わない構成で。

今のままでもコードを書くことは可能なのですが
「柔軟性にかける」ということでもう少し勉強して
見たいと思います。

オブジェクト指向な書き方もそうなのですが、
どうやらUnityは特別なようで、Unity指向とも
言うべきか「必要なときに参照する」というのが
主流らしいです。なのでUnityで実際に人のプログラム
を使ってどんな流れで構成されるのか、今本を買って
勉強中でございます。


大変申し訳ないですが、少しばかしこのFPSの開発
は一時的に止まってしまうでしょう。


PR

01.16.15:06

前回のダウンキャストについて。

申し訳ながらこの方法では成功しない可能性が出てきました。

と言うのも実際に組み込んでみたところ、nullが入っているのです。
どうやら上手く入っていない様子です。

もう少し考えてみる事に致します。

01.10.20:42

c# 派生クラスに基底クラスをぶち込む「ダウンキャスト」について。

継承したクラス、
派生クラスの変数にどうしても基底クラスを
代入したいそんな時皆さんはどうしていますか?

ちなみに皆様ご存知違う型への変換を「キャスト」
と呼びますよね。実はその中に細分化されてまして
アップキャストとダウンキャストというものがあります。


アップキャストとは、
派生クラスを基底クラスに入れる事です。
例えば、

   //基底クラス
   class Base { }   
   //派生クラス
   class  Derived : Base { }

   

   //基底クラス型の「b」
   Base b;
   //派生クラス型の「d」
   Derived d;


   //インスタンス生成
   b = new Base();
   
   //派生クラス「b」を基底クラス「d」に代入可能。
   d = b ;


これがアップキャストだそうです。
派生を基底に代入する事は何の問題もなく代入可能
のようなのです。キャストすらする必要も無いという。
しかしこの逆の基底を派生に代入する、というのが少し
ばかり注意みたいで、これを「ダウンキャスト」と言う
ようです。

ではまったく同じ事をして見ましょう。


  //基底クラス
   class Base { }   
   //派生クラス
   class  Derived Base { }

   

   //基底クラス型の「b」
   Base b;
   //派生クラス型の「d」
   Derived d;

 
   //インスタンスの生成
   d= new  Derived();

   //キャストしてもエラーになる
   b = (Base)d;


これはエラーになってしまうんですね。
一見派生のほうが基底のクラスよりメンバが
同じかそれ以上あるので、基底にあるメンバ
のみに代入してくれそうな気はしますが残念
ながら基底クラス側「b」が「d?そんな奴
しらないよ!」と拒絶するのです。

キャストとはどうやら型を変換するだけであり、

中身自体の値が消えるわけではない

と言う点に注意。


ではどうすればダウンキャストできるのでしょうか?
キャストでだめなら一体どうすれば・・・意外にダウン
キャストの情報はそれほど多くないのです。

大体が良く分からない(理解できる脳を持ち合わせていない)
中、これは!というものを見つけました。

重要なタイミングはどうやらインスタンス化にあるようです!!
最初のBase型に同じ型でnewするのではなく、


//ここが重要!
b = new Derived ();

d = (Derived )b;

派生型を入れてやる事がミソなんだそうです。
Base型なのに派生型のDerivedをnewするなんて
c++から来た私には異様に見えますw

まぁ、なぜ問題なくできるのかと言うのは正直
説明できません。理解するには今一度、宣言とは、
C#のnewとは、キャストとはどんなものかを
掘り下げて勉強する必要が出てきそうですね・・・


01.05.23:20

Unityメモ#1

        //MonoBehaviourを継承すると"new"できない!
        //クラスの配列をnewしても、インスタンス化するわけではない。

12.29.22:51

見えない部分を。

ちょいとC#を勉強してみました。

うむ、やはりC++とはまったく違うといってよいでしょう。
恐ろしいことに、C/C++ではメモリを手動で管理するのですが
C#では自動みたいなんです!

これはびっくりですね!
この仕組みをガベージコレクションと言うらしいです。



まぁそんなこんなで進行度は以前のインベントリの内部実装中で
とまっております。

グローバル変数でインベントリ管理をしようと思ったのですが
ご覧の通りC#では基本グローバルはしないほうが良いという構造
らしく、C#の構成をいままで勉強していました。

今日は目が痛いので、明日構成を改めて組んでみます。
   NEXT >>>