2011-11-12 14 views
0

可能性の重複:
C# virtual static methodC#の静的メソッドのInheretence

アイデア:

public class Item 
{ 
     public Vector2 Position; 
     virtual static Sprite mySprite; 
     public void Draw() {Draw mySprite at Position} 
} 

public class Couch:Item 
{ 
     override static Sprite mySprite=someCouchImage; 
} 
public class Table:Item 
{ 
     override static Sprite mySprite=someTableImage; 
} 

説明 多くのテーブルとCoがあります。ゲーム世界ではユニークなポジションを持っています。 各テーブルは、次の表と同じスプライトを持ちます。 私が100テーブルを持っているとき、100のスプライトがあるのは馬鹿げているようです。

質問 は、すべてのテーブルが100個のスプライトを持つことなく、同じスプライトを共有するような方法があります(また、Itemクラスで参照可能でありながらは?)

+0

@KirkWoll公平では、ユーザーが求める回避策をユーザーに与えるものではありません。 –

答えて

1

明らかに、C#はこれをサポートしていません。ただ、この「上クラスの種類に基づいてスプライト(すなわちスイッチを返す通常のプロパティを作成し、代わりに仮想静的変数を作成する

public class Item 
{ 
     public Vector2 Position; 
     static Sprite mySprite; 
     protected virtual Sprite getMySprite() { return mySprite; } // Virtualize getting the sprite 
     public void Draw() {Draw getMySprite() at Position} 
} 

public class Couch:Item 
{ 
     static Sprite mySprite=someCouchImage; 
     override Sprite getMySprite() { return mySprite; } // Get the custom sprite 
} 
public class Table:Item 
{ 
     static Sprite mySprite=someTableImage; 
     override Sprite getMySprite() { return mySprite; } // Get the custom sprite 
} 
+0

これはうまくいきます! Heh、私はすでにこれを試してみましたが、それは動作します:) –

+0

これを使用する予定の誰かに1つのコメント: Item.mySpriteを参照したい場合は、CouchのmySpriteの代わりにItemのmySpriteを返します。 (Couch)TargetItem.mySpriteはあなたがそれがCouchだと分かっているならば動作します –

+0

インスタンスから静的メンバーに実際にアクセスするはずがない...あなたは 'Couch.mySprite'を使うべきです、あるいは' targetItem.getMySprite( ) ' –

0

私はこれをコンパイルしようとするだろうがなかったですこのようなものがあなたのために働くのですか?

public class Item 
{ 
    public Vector2 Position; 

    protected static Dictionary<Type, Sprite> sprites = new Dictionary<Type, Sprite>(); 
    public static void RegisterSprite(Type type, Sprite sprite) 
    { 
     sprites.Add(type, sprite); 
    } 

    public void Draw() { 
      Draw sprites.Item(typeof(this)) at Position 
    } 
} 

public class Couch:Item {} 
public class Table:Item {} 

次に、便利な場所からスプライトを登録します。これは、あなたがSpriteを管理する責任を、それを担当するべきCouchとTableクラス以外の誰かに押し付けているので、懸念の分離には間違いありません。しかし、私はこの時間に私が思いつくことができる最高です。:)

+0

リソースが固定されていれば、これは素晴らしい実装です。この考え方は微妙に異なる問題にはかなり役立ちます。ありがとう! –

0


はここでかなり近いものを達成するための簡単な方法です。 getアクセサ()内のGetType()。ToString()))。

関連する問題