C#抽象类静态字段继承

时间:2010-08-22 16:01:42

标签: c# inheritance static field abstract

我觉得我跳过了一两个C#课程,但这是我的困境:

我有一个抽象类,我可以从中派生出多个子类。

我确信,对于每个子类,我将有一个构造函数需要某个静态对象作为模型,并且每个子类的对象都不同。

我的第一种方法是在抽象父类中创建一个公共静态对象然后,在我开始创建子类的任何实例之前,我会为每个实例修改它,但事实证明这样我实际上为抽象类只创建一个静态对象,并且每个子类都使用它。

我怎么能解决这个问题?

更确切地说,这是伪代码:

父抽象类:

 abstract class AbstractClass
{
   static public ModelObject Model;
   ...
}

其中一个子课程:

class Child : AbstractClass
{
    ...
    public Child()
    {
        this.someField = Model.someField;
    }
}

编辑:

模型需要是“ModelObject”类的成员,它不应该是单例或其他任何东西。

EDIT2:

更确切地说,我选择了这种实施方案来进行国际象棋游戏:我有一个抽象的国际象棋类,而儿童类代表游戏的具体部分:棋子,骑士等等。

抽象类继承自MeshMatObject,这是一个表示具有基本功能的通用3d对象的类,如旋转,网格,材质,纹理等,它定义了象棋游戏块的抽象方法,如GetPossibleMoves()。

我上面讨论的Model对象是MeshMatObject的成员,在我看来,应该只在类外定义一次然后用于所有部分。我的意思是:例如,所有的棋子都有相同的网格和纹理,所以每次想要制作棋子时,我都没有看到将模型作为参数的意义。

3 个答案:

答案 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;
    }
}