2016-04-03 36 views
1

私はクラスを持っていますPlayer以内にIntroがあり、そのインスタンスにNeighboursHouseでもアクセスする必要があります。すべてのサブクラスで繰り返さずにこれを行う方法はありますか?サブクラス内のクラスをインスタンス化し、別のサブクラス内のインスタンスにアクセス

明確にするために、私は各シーン内で新しいPlayerインスタンスを作成し、他のシーンでそれらにアクセスできるようにしたいと考えています。彼らは異なる成果に基づいて無作為に作成されるかもしれないので、必ずしも親クラスでそれらを作成することはできません。

+0

明確ではありません。それらのサブクラス間の関係は何ですか? – sawa

+0

私は本質的にコンソールベースのアドベンチャーゲームで作業しているので、シーンからシーンに移動し、各サブクラスはシーンです。ゲームが拡大するにつれて、サブクラスがシーンから継承できるようにしたいと思います。 –

+0

なぜ 'joe'は' Intro'で作られなければならないのですか? 'Scene'で作成できないのですか? – sawa

答えて

1

これはプログラム設計上の問題のようです。もし私があなただったら、私はむしろクラスPlayerにプレーヤーを管理させて、プレーヤーが必要な時にプレーヤーを "招待"するようにします。

class Player 
    @players = {} 

    def self.[](name, npc=true) 
    @players[name] ||= new(name, npc) 
    end 

    def initialize(name, npc=true) 
    @name = name 
    @npc = npc 
    end 
end 

そして、あなたはIntro、例えば、プレーヤーを必要とするとき:

class Intro < Scene 
    joe = Player["Joe", false] 
end 

をこの方法では、重複の選手を作成する心配する必要はありません。

唯一の反対は、同じ名前のプレーヤーが2人いることはできませんが、1人はnpcで、もう1人はそうでないことです。

+1

'@players [名前、npc]] 'とセットバックが解決されました – mudasobwa

+0

ありがとう - これは本当に役に立ちます。 –

-1

質問は、クラスが継承された(一度だけ継承あたり)されるたびに実行するためにいくつかのコードスニペットを取得する方法であれば、あなたはinheritedを探しています:

class Scene 
    def self.inherited(subclass) 
    super 
    joe = Player.new("Joe", false) 
    end 
end 
+0

ローカル変数 'joe'を割り当てることはまったく意味がありません。 – mudasobwa

+0

私は同意しますが、質問はプレーヤーのインスタンスについてではなく、すべての継承クラスのコンテキストで実行するコードを取得する方法がある場合です。答えは「はい」です。 – Ronna

+0

「joe」が一度インスタンス化されることを反映するように私の答えを編集しました。これは、あなたが疑問に思っていたものです。 – Ronna

0

質問は、明らかではないが、しかし、あなたはSceneにインスタンスを作成し、それをサブクラスから参照することができます。

class Scene 
    @@joe = Player.new("Joe", false) 
end 

class Intro < Scene 
    @@joe # => refers to the object 
end 

class NeighboursHouse < Scene 
    @@joe # => refers to the same object 
end 
関連する問題