最近オブジェクト指向での設計手法を勉強してるんですが、 「継承は何かと危険で厄介」「代わりに委譲を使うべし」というのを知りました。 継承のダメな点を学び、自分が作っているものがことごこく当てはまってることに気づき (それを継承のメリットだと信じて作ってきたから当然です)、「こりゃあなんとかせにゃいかん!」となってます。 GameMakerでは継承の仕組みは提供されていますが、委譲ってどうやるんでしょう? 委譲に相当する構造を実装することは可能なのでしょうか?
移譲は has-a (所持している)関係なので、機能を持たせたいオブジェクトの変数に、オブジェクトのインスタンスを持たせることで実現できます
■objShip の Createイベントで以下のように記述する
// 砲台オブジェクトを所持する _battery = instance_create_layer(0, 0, "Instances", objBattery); // 弾を撃つ関数 bullet = function(deg, speed) { // objBatteryの機能で弾を撃つ return _battery.bullet(self.x, self.y, deg, speed) };
※サンプルコードはビルドしていないので参考までに…
敵キャラを拡張するために基底となる敵キャラを内包しても良いですし、サンプルコードのように部品(機能)を所持する、という使い方でも良いです
具体的なサンプルコードまである説明をいただきありがとうございます! なるほどGameMakerでの委譲ってこういうことなんですね。 内包する、所持する、というのは具体的にどういうことなのかバシッと見えてきました。
GameMakerのオブジェクトはいろいろ装備されてますので、諸々の機能が必要なく、最小のものにしたければ下記のようにstructを使うのもありなのでしょうか… script weapons にBattery(struct)のコンストラクタを書いておく
function Battery(_bullet_remain) constructor { bullet_remain = _bullet_remain; bullet = function(_x, _y, _deg, _speed) { bullet_remain = max(0, bullet_remain-1); if (bullet_remain == 0) return; instance_create_layer(_x, _y, "Instances", objBullet); } }
objShip(船オブジェクト): create eventで砲台を作成して保持し、その機能を使う
battery = new Bullet(10); battery.bullet(self.x, self.y, deg, speed);
いろいろ試してみようと思います。 ご説明ありがとうございました!
確かにオブジェクトだと冗長な場合は struct で問題ないですね👍
不適切なコンテンツとして通報するには以下の「送信」ボタンを押して下さい。 管理チームへ匿名通報が送信されます。あなたが誰であるかを管理チームに特定されることはありません。
どのように不適切か説明したい場合、メッセージをご記入下さい。空白のままでも通報は送信されます。
通報履歴 で、あなたの通報と対応時のメッセージを確認できます。
トピックをWIKIWIKIに埋め込む
次のコードをWIKIWIKIのページに埋め込むと最新のコメントがその場に表示されます。
// generating...
プレビュー
マニュアル(ver2~2.2.x) マニュアル(ver2.3~) YoYoGames YoYoGames 公式コミュニティ GM関連のYoutubeチャンネル集 解説・資料サイト集(日本語) 解説・資料サイト集(英語)
ここまでがあなたのコンテンツ
ここからもあなたのコンテンツ
移譲は has-a (所持している)関係なので、機能を持たせたいオブジェクトの変数に、オブジェクトのインスタンスを持たせることで実現できます
■objShip の Createイベントで以下のように記述する
※サンプルコードはビルドしていないので参考までに…
敵キャラを拡張するために基底となる敵キャラを内包しても良いですし、サンプルコードのように部品(機能)を所持する、という使い方でも良いです
具体的なサンプルコードまである説明をいただきありがとうございます!
なるほどGameMakerでの委譲ってこういうことなんですね。
内包する、所持する、というのは具体的にどういうことなのかバシッと見えてきました。
GameMakerのオブジェクトはいろいろ装備されてますので、諸々の機能が必要なく、最小のものにしたければ下記のようにstructを使うのもありなのでしょうか…
script weapons にBattery(struct)のコンストラクタを書いておく
objShip(船オブジェクト): create eventで砲台を作成して保持し、その機能を使う
いろいろ試してみようと思います。
ご説明ありがとうございました!
確かにオブジェクトだと冗長な場合は struct で問題ないですね👍