如何在C#中执行“静态重载const”?

时间:2011-06-02 09:33:43

标签: c# polymorphism

我正在用C#创建游戏。每个级别由几个瓷砖组成。每个图块具有某种类型,例如草地,木墙等。

理想情况下,我希望有一个基类“Tile”并从中继承,为每种类型的tile创建类。我想让tile的属性成为子类的某种static / const / etc成员,因为每种类型的tile都只具有相同的属性。即我不希望100 Tiles有一个属性都具有相同的值,这似乎效率很低。

问题是你不能在C#中做到这一点。有没有办法达到我想要的目的?

我的另一个想法是将它全部分成树,一个只有表示实例的类“Tile”和另一个“TileType”,我从中为每种类型实例化一个对象,并可能通过某种“访问它们” TileTypeCollection”。这感觉很奇怪,我宁愿以第一种方式去做。

在处理这种情况时是否有任何一般性指导原则?

5 个答案:

答案 0 :(得分:4)

您正在寻找FlyWeight设计模式:

http://en.wikipedia.org/wiki/Flyweight_pattern

  

Flyweight是一种软件设计   图案。 flyweight是一个对象   通过共享来最小化内存使用   尽可能多的数据与其他   类似的对象;这是一种使用方式   一个简单的大量对象   重复表示将使用   不可接受的记忆量。

enter image description here

您在此处有一些C#示例:http://www.dofactory.com/Patterns/PatternFlyweight.aspx#_self2

答案 1 :(得分:2)

您可以按如下方式创建类结构:

public abstract class Tile
{
  public abstract string BaseType;
}

public class Floor : Tile
{
  public override string BaseType
  {
    get
    {
       return "floor";
    }
  }
}

public class Grass : Tile
{
  public override string BaseType
  {
    get
    {
       return "grass";
    }
  }
}

public class Wooden : Tile
{
  public override string BaseType
  {
    get
    {
       return "wooden";
    }
  }
}

答案 2 :(得分:1)

你不能只使用静态字段来支持你的Tile基类的属性吗?

public abstract class Tile
{
  private static string _commonProperty

  public static string CommonProperty
  {
    get { return _commonProperty; }
    set { _commonProperty = value; }
  }
}

答案 3 :(得分:0)

一种方法是在子类上使用静态属性,在基类中使用非静态虚拟访问器,当覆盖时返回静态值。

答案 4 :(得分:0)

根据具体要求,有几种选择可供选择。

如果有一个公共属性,每个类型的值都不同,那么在基类中声明它,使其成为readonly值并在每种类型的构造函数中设置它。

如果您拥有仅存在于特定类型的属性,那么这些属性应该在子类中声明,并且类似地是只读的。