【发布时间】:2016-03-27 21:31:11
【问题描述】:
我有一个带有静态变量的基类。我想创建派生子类,它们将自动拥有自己的非共享静态变量。理想情况下应该是这样的:
class Parent
{
Texture2D picture;
static Texture2D pictureOrigin;
Parent()
{
picture = pictureOrigin;
/*Loading the static origin to an instance variable
because I might want to have more pictureOrigins
and alternate them or perhaps change the picture
of the instance based on a certain event, etc.*/
}
}
class Subclass1 : Parent
{
Subclass1() : base()
{ }
}
class Subclass2 : Parent
{
Subclass2() : base()
{ }
}
void main()
{
Parent.pictureOrigin = Load("pictureForParent");
Subclass1.pictureOrigin = Load("pictureForSubclass1");
Subclass2.pictureOrigin = Load("pictureForSubclass2");
//Then creating instances of the classes and drawing them, etc.
}
但是发生的情况是它们都获得了最后加载的图像 (pictureForSubclass2),因为静态变量 pictureOrigin 在它们之间共享。
最快的解决方法是手动为每个子类添加新的静态变量pictureOrigin,并隐藏基类的pictureOrigin变量:
class Subclass1 : Parent
{
new static Texture2D pictureOrigin;
Subclass1() : base()
{
picture = pictureOrigin;
}
}
或者,创建抽象方法或类似方法以确保在子类中创建新的静态变量。但这似乎太麻烦而且不太优雅。有更好的方法吗?
【问题讨论】:
-
静态似乎是个坏主意,为什么它必须是静态的?您可以将图像资源加载到某个图像存储中,然后为每个实例提供所需的图像?
-
在您的代码中,Subclass1 和 Subclass2 不是从 Parent 继承的。
-
您可以将
Parent设为通用,如class Parent<T> where T : Parent<T>,然后为继承指定子类的类型:class Subclass1 : Parent<Subclass1>。然后,您将利用<T>类型的每个唯一组合将获得所有静态字段的自己的副本这一事实。话虽如此,我会尝试完全摆脱static关键字并找到一种不同的方法来做到这一点。
标签: c# inheritance static-variables