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)
这允许我在非泛型函数中使用的公共基类.这也允许派生类型选择确切的模型类型,并可以减少铸造.
| 归档时间: |
|
| 查看次数: |
15754 次 |
| 最近记录: |