Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:静态方法的固有性_C#_Inheritance_Static_Virtual - Fatal编程技术网

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()
如果资源得到修复,这将是一个很好的实现-这个想法可能对一个微妙的不同问题非常有帮助。谢谢