我正在试图弄清楚是否有可能强制子类在从父类派生的静态方法中使用自己的变量。
class Parent
{
public static string myString = "I don't want this string";
public static void MyMethod()
{
Console.Write(myString);
}
}
class Child : Parent
{
public static string myString = "I want THIS string";
}
class Program
{
static void Main()
{
Child.MyMethod(); // I want to output "I want THIS string";
}
}
有什么方法可以做到吗?
答案 0 :(得分:4)
任何方式?当然,但我永远不会这样做。重新思考你的设计。这是一个非常糟糕的黑客:
class Parent{
public static string myString = "I don't want this string";
public static void MyMethod(){
Console.Write(myString);
}
}
class Child : Parent{
new public static string myString = "I want THIS string";
public new static void MyMethod(){
var old=Parent.myString;
Parent.myString=myString;
Parent.MyMethod();
Parent.myString=old;
}
}
class Program
{
static void Main()
{
Child.MyMethod(); // I want to output "I want THIS string";
}
}
如果你试图这样做是因为MyMethod中的代码非常复杂,你不想重复它,那么这样做几乎可以保证你能够打破一些非常糟糕的东西,因为它可以解决问题。当孩子正在做这件事时,我会在Parent中更改myString的值。非常糟糕。
答案 1 :(得分:1)
是的,有一个解决方法。使用单例模式并将这些字段设为虚拟。
答案 2 :(得分:1)
请改用实例方法。静态成员(方法,字段)有它们的位置,但通常不能很好地适应OOP设计原则。
此外,我认为您的继承层次结构没有多大意义。
查看MSDN多态性指南,这是了解这些基础知识的良好开端:
答案 3 :(得分:0)
static
修饰符不适用于子类。指定静态方法或字段的完整方法是使用类名。在您的示例中,您在两种情况下访问的字段都是Parent.mystring
。
将static
标记为全局变量或函数。
执行所需操作的唯一方法是使用实例方法和字段:
class Parent
{
protected string myString = "I don't want this one";
public void MyMethod()
{
Console.Write(myString);
}
}
class Child : Parent
{
public Child()
{
myString = "I want this one";
}
}
如果你这样做:
Parent variable = new Parent();
variable.MyMethod();
您将看到原始字符串,但如果您这样做:
Parent variable = new Child();
variable.MyMethod();
您将看到新字符串。
另请注意,如果更改静态字段的值,则无论您如何访问它,都会针对整个应用程序进行更改。你不能在某些情况下使用一个字符串而其他情况则使用另一个字符串。那是什么实例值。