2012-02-24 8 views
3

私はDrawableGameComponentから継承したさまざまな種類のクラスの多くのインスタンスを持つ1つのクラス(DrawableGameComponent)のリストを持っているという問題があります。Cでの継承クラスからの変数の取得#

私はこれらのクラスのいずれかから変数にアクセスしたいですが、DrawableGameComponentとして宣言されているため、DrawableGameComponent以外の変数にはアクセスできません。

メインクラス:

List<DrawableGameComponent> entities = new List<DrawableGameComponent>(); 

"プレーヤー" クラス:

public Color color; 
public int score; 

私はメインクラスから、これらの変数にアクセスする方法の任意のアイデア?

+3

子クラスのメンバーにアクセスする必要はありません。おそらく、基本クラスは抽象メソッドを呼び出さなければならず、子クラスのメンバーが必要とするどのようなロジックでも実装する必要があります。 – cadrell0

答えて

2

DrawableGameComponentは、あなたがこれを行うことができますPlayerのベースである場合:「」として

foreach(DrawableGameComponent entity in entities) 
{ 
    Player player = entity as Player; 
    if(player != null) 
    { 
     Color col = player.color; 
     int score = player.score; 
    } 
} 

Beacause「です」とキャストが、一度だけそれを行うことが好ましい比較的高価である - 上記のように。

0

これらのクラスは、同じプロジェクト(スコープ)であり、あなたは以下を使用することができますと仮定:

if (dgc is Player) 
{ 
    (dgc as Player).color = Colors.Red; 
} 
+0

ありがとう、これは私が探していたものです –

+0

@ AskI.Nator素晴らしい!この回答は役に立ちましたので、その横にあるチェックマークをクリックして受け入れてください! –

+1

これは技術的には正しいですが、システム設計の観点からは、派生クラスを認識し、その知識に基づいて動作する基本クラスを持つことは非常に悪い考えです。他に何もなければ、潜在的に[固体]のL(http://en.wikipedia.org/wiki/SOLID_(オブジェクト指向設計))を破る可能性があります。 –

0

短い答えは

if(entity[0] is Player) 
{ 
    ((Player)entity[0]).color 
} 
1

ライアンPのは、その権利を持っています。 PlayerがDrawableGameComponentから派生していることが確実な場合は、上記のようにDrawableGameComponentのインスタンスをPlayerにキャストできます。

ただし、DrawableGameComponentインスタンスの一部がPlayer以外のものである可能性があると考えてください。たとえば、敵かもしれない。あなたは具体的にインスタンスで何をやっているのかは言いませんが、この種のダウンキャストは通常​​デザインの問題を表しています。

ちょっと考えてください。

0

継承されたクラスで定義されたプロパティにアクセスする場合は、その型にキャストする必要があります。 DrawableGameComponent型インスタンスにのみ内のプロパティを公開することができ、それ(またはそれは例えばSystem.Objectから継承する任意の型)ですから、次があれば

class Player : DrawableGameComponent 
{ 
    public int MyWidth { get; set; } 
} 

その後、あなただけのときMyWidthプロパティにアクセスすることができますあなたはプレーヤーのインスタンスを持っている:

Player playerObj = dgcObj as Player; 
if (playerObj != null) Console.Write(playerObj.MyWidth); 

以下は動作しませんのに対し:

DrawableGameComponent dgcObj = new Player(); 
dgcObj.MyWidth // no such property 
0

私はあなたがそうのようなものをキャストすることができることを知っていると仮定しています:

Player p = (Player)entities[0]; 

は、だから私はあなたが持っている何を考えて設計上の問題です。 is演算子を使用して、エンティティがPlayerかどうかを判断できますが、RTTIがあまりにも高すぎると問題が発生する可能性があります。そのちょうど1つのインスタンスの場合、キャストするのは良い選択です。

1

あなたの継承モデルが間違っているようです:変数(あなたの例ではColorと仮定します)がすべて/最も派生したクラス(player、bot、相手など)で宣言されている場合は、 。色を使用しない派生クラスは無視することができます

関連する問題