可能重复:
C# virtual static method
观
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;
}
解释 游戏世界中有许多桌子和沙发,每个都有其独特的位置。 每个表都具有与下一个表相同的Sprite。 当我有100张桌子时,有100个精灵似乎很愚蠢。
问题 有没有办法使所有的表共享相同的Sprite而没有100个Sprite(同时也可以在Item类中引用?)
答案 0 :(得分: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
}
答案 1 :(得分: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类,我猜。但这是我能在这个时候想出来的最好的...... :)。
答案 2 :(得分:0)
不是创建虚拟静态变量,而是创建一个常规属性,该属性根据类的类型返回一个精灵(即打开&#34; this.GetType()。ToString()&#34;在得到访问者))。