我正在用C#创建游戏。每个级别由几个瓷砖组成。每个图块具有某种类型,例如草地,木墙等。
理想情况下,我希望有一个基类“Tile”并从中继承,为每种类型的tile创建类。我想让tile的属性成为子类的某种static / const / etc成员,因为每种类型的tile都只具有相同的属性。即我不希望100 Tiles有一个属性都具有相同的值,这似乎效率很低。
问题是你不能在C#中做到这一点。有没有办法达到我想要的目的?
我的另一个想法是将它全部分成树,一个只有表示实例的类“Tile”和另一个“TileType”,我从中为每种类型实例化一个对象,并可能通过某种“访问它们” TileTypeCollection”。这感觉很奇怪,我宁愿以第一种方式去做。
在处理这种情况时是否有任何一般性指导原则?
答案 0 :(得分:4)
您正在寻找FlyWeight设计模式:
http://en.wikipedia.org/wiki/Flyweight_pattern
Flyweight是一种软件设计 图案。 flyweight是一个对象 通过共享来最小化内存使用 尽可能多的数据与其他 类似的对象;这是一种使用方式 一个简单的大量对象 重复表示将使用 不可接受的记忆量。
您在此处有一些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值并在每种类型的构造函数中设置它。
如果您拥有仅存在于特定类型的属性,那么这些属性应该在子类中声明,并且类似地是只读的。