我觉得我跳过了一两个C#课程,但这是我的困境:
我有一个抽象类,我可以从中派生出多个子类。
我确信,对于每个子类,我将有一个构造函数需要某个静态对象作为模型,并且每个子类的对象都不同。
我的第一种方法是在抽象父类中创建一个公共静态对象然后,在我开始创建子类的任何实例之前,我会为每个实例修改它,但事实证明这样我实际上为抽象类只创建一个静态对象,并且每个子类都使用它。
我怎么能解决这个问题?
更确切地说,这是伪代码:
父抽象类:
abstract class AbstractClass
{
static public ModelObject Model;
...
}
其中一个子课程:
class Child : AbstractClass
{
...
public Child()
{
this.someField = Model.someField;
}
}
编辑:
模型需要是“ModelObject”类的成员,它不应该是单例或其他任何东西。
EDIT2:
更确切地说,我选择了这种实施方案来进行国际象棋游戏:我有一个抽象的国际象棋类,而儿童类代表游戏的具体部分:棋子,骑士等等。
抽象类继承自MeshMatObject,这是一个表示具有基本功能的通用3d对象的类,如旋转,网格,材质,纹理等,它定义了象棋游戏块的抽象方法,如GetPossibleMoves()。
我上面讨论的Model对象是MeshMatObject的成员,在我看来,应该只在类外定义一次然后用于所有部分。我的意思是:例如,所有的棋子都有相同的网格和纹理,所以每次想要制作棋子时,我都没有看到将模型作为参数的意义。
答案 0 :(得分:17)
通过使Abstract类具有通用性,您可以绕过共享静态字段。每个泛型类都将获得它自己的静态字段副本。
abstract class AbstractClass<T>
{
static public ModelObject Model;
...
}
然后每个子类将使用静态字段的不同实例。
class Child : AbstractClass<Child>
{
...
public Child()
{
this.someField = Model.someField;
}
}
AbstractClass不引用泛型参数并不重要。您只是使用它为每个子类提供基类的唯一实例。
答案 1 :(得分:6)
我倾向于使用与@ shf301类似的解决方案。根据您的需要,将基类设置为:
可能很有用abstract class AbstractClass
{
}
abstract class AbstractClass<TModel> : AbstractClass
where TModel : ModelObject
{
static public TModel Model;
...
}
这允许我在非泛型函数中使用的公共基类。这也允许派生类型选择确切的模型类型,并可以减少铸造。
答案 2 :(得分:3)
工厂如何将类与继承的模型分离:
public static class ModelObjectFactory
{
public static ModelObject GetModel<T>(T obj)
{
// return ModelObject according to type of parameter
}
}
class Child
{
public Child()
{
ModelObject mo = ModelObjectFactory(this);
this.someField = mo.someField;
}
}