C#强制子类中的静态数据成员
是否可以强制继承子类中的静态数据成员 以下是我的问题/思考过程: 我想创建一个“GameObject”基类,所有其他对象都从该基类继承,以用于多态性 我希望每个继承的类都有一个顶点的静态数据成员列表来渲染多边形。确切的过程是:C#强制子类中的静态数据成员,c#,oop,opengl,inheritance,static,C#,Oop,Opengl,Inheritance,Static,是否可以强制继承子类中的静态数据成员 以下是我的问题/思考过程: 我想创建一个“GameObject”基类,所有其他对象都从该基类继承,以用于多态性 我希望每个继承的类都有一个顶点的静态数据成员列表来渲染多边形。确切的过程是: 基于顶点的静态列表创建对象 应用纹理 基于实例化对象的旋转变量旋转对象 基于实例化对象的世界坐标变换对象 对于从游戏对象继承的所有对象,我想保证它具有静态顶点列表 我应该关心它是否有列表,还是只关心它有一个draw方法(由接口iRender保证)?如果游戏对象是一个接
- 基于顶点的静态列表创建对象
- 应用纹理
- 基于实例化对象的旋转变量旋转对象
- 基于实例化对象的世界坐标变换对象
我应该关心它是否有列表,还是只关心它有一个draw方法(由接口iRender保证)?如果游戏对象是一个接口,那么你可以强制存在一个
静态属性
interface GameObject
{
static List<vertex> vertices {get; set;}
//other common code
};
接口游戏对象
{
静态列表顶点{get;set;}
//其他通用代码
};
或者,您可以将顶点列表作为GameObject
本身的受保护数据成员,并让派生类访问它。由于继承,基类中受保护的静态列表会自动成为任何派生类的一部分。只要您不需要每个派生类,就可以这样做类将其自己的列表与任何父类中的列表分开。基类中为所有子类和基类本身声明了静态类成员的单个实例。因此,基类中的单个顶点列表不起作用。可以做什么:
-在基类中声明
private static Dictionary<string, List<vertex>> PointsPerClass =
new Dictionary<string, List<vertex>>();
private静态字典PointsPerClass=
新字典();
您没有说明子体如何指定其顶点,但假设有一个虚拟基类方法被所有子体覆盖:
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;
}
公共游戏对象CreateObject()
{
string key=GetType().FullName;
列表点=空;
if(点类容器(键))
points=PointsPerClass[关键点];
否则{
点=新列表();
PointsPerClass.Add(关键点,点);
填充顶点(点);
}
//CreateObjectFromPoints是由子体实现的抽象方法
GameObjectGameObj=CreateObjectFromPoints(点);
//应用纹理、旋转等
返回gameObj;
}
我会让GameObject成为一个接口还是一个基类?多态性与接口一起工作吗?看起来如何?另外,如果我把列表放在接口中,它不会为每个实例对象创建一个顶点列表吗?我正试图对所有类似的对象实例使用一个多边形列表,然后进行单独的转换特定instancesGameObject的修饰符将是一个接口。多态性仅适用于C#中的接口(最多一个类)。我得到“修饰符'static'对此项无效”。不编译。它需要分开,因为它们是不同的游戏对象类型(例如,假设我有一个房子游戏对象,然后我有一个树游戏对象。它们会有不同的垂直列表,因为它们是不同的对象)。我将有一个基类游戏对象,这样我就可以将所有游戏对象放入一个循环中,比如GameObject.Draw(),或者类似的东西。这就是继承点——如果基类定义了列表,那么任何派生类都将列表作为其定义的一部分。该列表不是房屋
列表或树
列表;这是一个对象
列表。从同一基类派生的两个类仍然是独立的类;即使它们共享部分定义,也没有任何共同的数据。树
类中的列表不会与房屋
类中的列表相同。对,但我要说的是,我不希望每个实例化对象都有一个列表。它应该是由该特定继承对象的所有实例共享的垂直列表之一。拥有受保护的静态列表会让我为每个子对象拥有不同的静态列表吗?