乱反射の光跡 in hatenablog

なみへいのブログです。hatenablogヴァージョン。

制作ノート その12

NNCardDeck version0.4 (1)


ああ、しまった! 忘れてました!


とりあえずは「カードの山」のオブジェクト、NNCardDeckまで作ってはみたものの、ゲーム全体の構造とオブジェクトモデルとして設計する部分、表示の方法などをあれこれ考えているうちに頭の中がごちゃごちゃしてしまい、BlackJackのソースファイルは現在、HDの隅っこで放置プレイ中(笑)。


現在のところ、あとひとつ(かふたつ、あるいはみっつ?)くらいはオブジェクトモデルが必要かな、などと思っていて、オブジェクトモデルの設計に関して漠然と構想を練っていたのですが、ふいに気づいてしまいました。「NNCardDeck」についての文章とソースコードを公開していない、ということに(笑)。
ありゃあ、2ヶ月も放置してましたか。やれやれ(笑)。


という訳で、近々「NNCardDeck」のソースコードを公開予定。


「NNCardDeck」は、以前公開した「NNDeck」の改訂版です。今回からカードゲーム用に設計したクラスには「NNCard....」という名前を付けていくことにします。
 基本的にこのクラスがやることは、カードオブジェクトの配列を保持して、そこから1枚ずつ抜いてコントローラに渡す、ということが主なので、殆どNSMutableArrayで充分なのですが、「ランダムにカードを渡す」メソッドや、カード配列を初期化するメソッドなど、独自のメソッドも必要になります。


そこで、NSMutableArrayのサブクラスにするのはどうか、と考えたのですが、その場合に配列を扱うメソッドをどうすればいいのか、ちょっと考えただけでは分かりません。はて、どうすればいいんでしょう???
などと悩んでいたら、ちゃんと『Cocoa基礎ガイド』にありました。
NSArray, NSSet, NSNumberなど、いくつかのクラスは複数のクラス定義をひとつのクラスとして扱えるように設計された「クラスクラスタ」という構造になっているそうで。この辺の詳しい話は僕にはちゃんと理解できているかどうか、実に怪しい(笑)ので、『Cocoa基礎ガイド』に当たってもらった方がいいかと(笑)。


ともあれ、この「クラスクラスタ」のサブクラスを作るにはいくつかの注意が必要らしいです。「らしいです」って……(笑)。
ちょうど『Cocoa基礎ガイド』の一例としてNSMutableArrayの「複合サブクラス」を作る方法が記載されているので、これに従って、NSMutableArrayのサブクラスとして、「NNCardDeck」を作ってみることにしました。
「複合サブクラス」の基本だそうですが、NSMutableArrayのサブクラスとして宣言し、インスタンス変数としてNSMutableArrayを用意します。そうしておいてNSMutableArrayのプリミディヴ・メソッドをオーバーライドして、(インスタンス変数の)NSMutableArrayを操作するように書き換える、ということになります。


一瞬考えたのは、「NSObject」のサブクラスとして設計するのと、どこが違うのか、ということ。
これは、NSMutableArrayのサブクラスとして宣言することで、必然的にNSMutableArrayのプリミディヴ・メソッドのオーバーライドが必要となるということ。つまり、NSMutableArrayのサブクラスのインスタンスはNSMutableArrayのプリミディヴ・メソッドを実装しているため、外のオブジェクトからは、あたかもNSMutableArrayのインスタンスとして扱えるということ。なのではないかと、思いますが。
これがNSObjectのサブクラスであれば、NSMutableArrayのメソッドはサポートされてない訳ですし。


もともと「NSMutableArrayで充分」だと思っていたオブジェクトでもありますし、外からNSMutableArrayとして扱えた方が、何かと便利なような気がするのですが。
……気のせい、かもしれませんが(笑)。


とりあえずはそう考えて、NSMutableArrayのサブクラスとして設計することに。
で、中見の方なのですが、だらだらと書き始めるととても長くなりそうなので(笑)、それはまた次回、ということで。
できれば、ソースコードの公開を先にできればなあ、と思ってますが。できれば、もしもできるなら、いやそれはどうか(笑)、いやいやそんなことを、言ってはいけませんな(笑)。