C#:静态方法的固有性
可能重复:C#:静态方法的固有性,c#,inheritance,static,virtual,C#,Inheritance,Static,Virtual,可能重复: 创意: 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
创意:
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;
}
解释
游戏世界中有许多桌子和沙发,每一张都有其独特的位置。
每一张桌子都有与下一张桌子相同的雪碧。
当我有100张桌子时,就有100个精灵,这似乎很愚蠢
问题
有没有一种方法可以让所有表共享同一个Sprite,而不必拥有100个Sprite(同时在Item类中也是可引用的?我没有尝试编译此文件,但是否需要为您编写此文件
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 {}
公共类项目
{
公共向量2位置;
受保护的静态字典精灵=新建字典();
公共静态无效注册表Sprite(类型,Sprite-Sprite)
{
雪碧。添加(类型,雪碧);
}
公众抽签(){
在位置处绘制精灵项目(类型(此))
}
}
公共类:项目{}
公共类表:项{}
然后从某个方便的位置注册您的精灵。这对分离关注点是不好的,因为你把管理精灵的责任推给了其他人,而不是沙发和桌子类,我想谁应该对此负责。但这是我在这个时候能想到的最好的了……) 显然,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
}
与其创建一个虚拟静态变量,不如创建一个基于类类型返回精灵的常规属性(即,在get访问器中打开“this.GetType().ToString()”)。@KirkWoll公平地说,这并不能完全满足用户的要求。这很有效!呵呵,我想我已经试过了,但它很管用:)给任何打算使用它的人一个建议:如果你想引用一个Item.mySprite,它将返回该Item的mySprite而不是coach的mySprite。如果您知道它是一个couchy,那么Casting(coach)TargetItem.mySprite就可以工作,您实际上不应该从实例访问静态成员。。。您应该使用
coach.mySprite
,或者使用targetItem.getMySprite()
如果资源得到修复,这将是一个很好的实现-这个想法可能对一个微妙的不同问题非常有帮助。谢谢