0

是否可以在继承的子类中强制使用静态数据成员?

这是我的问题/思考过程:

我想创建一个“GameObject”基类,所有其他对象都继承自该基类以借给多态性。

我希望每个继承的类都有一个静态数据成员顶点列表来渲染多边形。确切的过程是:

  • 基于顶点的静态列表创建对象
  • 应用纹理
  • 根据实例化对象的旋转变量旋转对象
  • 根据实例对象的世界坐标变换对象

对于从游戏对象继承的所有对象,我想保证它具有静态顶点列表

我应该关心它是否有列表,还是只关心它有一个绘制方法(由 iRender 接口保证)?

4

3 回答 3

1

由于继承,protected static List<Vertex>基类中的 a 自动成为任何派生类的一部分。只要您不需要每个派生类都有自己的列表与任何父类中的列表分开,这应该可以工作。

于 2012-11-12T16:51:52.440 回答
1

在基类中为所有后代和基类本身声明了一个静态类成员的单个实例。因此,基类中的单个顶点列表是行不通的。可以做什么: - 在基类中声明

private static Dictionary<string, List<vertex>> PointsPerClass = 
    new Dictionary<string, List<vertex>>();

你没有说后代如何指定他们的顶点,但是假设有一个被所有后代覆盖的虚拟基类方法:

protected virtual FillStaticVertices(List<vertex> aVertices)
{
}

然后基类有公共方法:

public GameObject CreateObject()
{
    string key = GetType().FullName;
    List<vertex> points = null;
    if (PointsPerClass.ContainsKey(key))
      points = PointsPerClass[key];
    else {
      points = new List<vertex>();
      PointsPerClass.Add(key, points);
      FillStaticVertices(points);
    }

    // CreateObjectFromPoints is an abstract method implemented by descendants
    GameObject gameObj = CreateObjectFromPoints(points);
    // apply textures, rotations, etc

    return gameObj;
}
于 2012-11-12T17:14:34.607 回答
-1

如果 GameObject 是一个接口,那么您可以强制存在一个static Property.

interface GameObject
{
     static List<vertex> vertices {get; set;}
     //other common code
};

或者,您可以将顶点列表GameObject本身作为受保护的数据成员,并让派生类访问它。

于 2012-11-12T16:51:12.447 回答