C#:静态方法的继承

时间:2011-11-12 00:20:00

标签: c# inheritance static virtual

  

可能重复:
  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类中引用?)

3 个答案:

答案 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;在得到访问者))。