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

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

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

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

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

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

您正在寻找FlyWeight设计模式:

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

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

在此处输入图像描述

你在这里有一些C#样本: http : //www.dofactory.com/Patterns/PatternFlyweight.aspx#_self2

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

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"; } } } 

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

 public abstract class Tile { private static string _commonProperty public static string CommonProperty { get { return _commonProperty; } set { _commonProperty = value; } } } 

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

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

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

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