C#强制子类中的静态数据成员

时间:2012-11-12 16:46:22

标签: c# oop opengl inheritance static

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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;
}

答案 2 :(得分:-1)

如果GameObject是一个界面,那么你可以强制存在static Property

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

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