C#抽象类静态字段继承

can*_*rem 16 c# inheritance static field abstract

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

我有一个抽象类,我从中派生出多个子类.

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

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

我怎么能解决这个问题?

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

父抽象类:

 abstract class AbstractClass
{
   static public ModelObject Model;
   ...
}
Run Code Online (Sandbox Code Playgroud)

其中一个子课程:

class Child : AbstractClass
{
    ...
    public Child()
    {
        this.someField = Model.someField;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

Model需要是"ModelObject"类的成员,它不应该是单例或其他任何东西.

EDIT2:

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

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

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

shf*_*301 18

您可以通过使Abstract类通用来绕过共享静态字段.每个泛型类都将获得它自己的静态字段副本.

abstract class AbstractClass<T>
{
   static public ModelObject Model;
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后每个子类将使用静态字段的不同实例.

class Child : AbstractClass<Child>
{
    ...
    public Child()
    {
        this.someField = Model.someField;
    }
}
Run Code Online (Sandbox Code Playgroud)

AbstractClass不引用泛型参数并不重要.您只是使用它为每个子类提供基类的唯一实例.


小智 6

我倾向于使用类似于@ shf301的解决方案.根据您的需要,将基类设置为:

abstract class AbstractClass
{
}

abstract class AbstractClass<TModel> : AbstractClass
    where TModel : ModelObject 
{
   static public TModel Model;
   ...
}
Run Code Online (Sandbox Code Playgroud)

这允许我在非泛型函数中使用的公共基类.这也允许派生类型选择确切的模型类型,并可以减少铸造.