如何在parents静态方法中使用child的变量?
How to use variables of child in parents static method?
我想弄清楚是否有可能我如何强制 child class 在派生自 parent 的静态方法中使用它们自己的变量。
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";
}
}
有什么办法吗?
是的,有一个解决方法。使用单例模式并使这些字段虚拟化。
改用实例方法。静态成员(方法、字段)有它们的位置,但通常不能很好地融入 OOP 设计原则。
此外,我认为您的继承层次结构没有多大意义。
查看有关多态性的 MSDN 指南,这是了解这些基础知识的良好开端:
任何方式?当然可以,但我永远不会这样做。重新考虑您的设计。这是一个非常糟糕的技巧:
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 中的代码太复杂而不想重复它而尝试这样做,那么这样做几乎可以保证您会破坏一些非常糟糕的东西,因为它会改变值myString 在 Parent 中,而 child 正在做这件事。很差。
static
修饰符不适用于子classes。指定静态方法或字段的完整方法是使用 class 名称。在您的示例中,您在两种情况下访问的字段都是 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();
您将看到新字符串。
另请理解,如果您更改静态字段的值,则无论您如何访问它,整个应用程序都会发生更改。您不能让某些情况下使用一个字符串而其他情况下使用另一个。这就是实例值的用途。
我想弄清楚是否有可能我如何强制 child class 在派生自 parent 的静态方法中使用它们自己的变量。
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";
}
}
有什么办法吗?
是的,有一个解决方法。使用单例模式并使这些字段虚拟化。
改用实例方法。静态成员(方法、字段)有它们的位置,但通常不能很好地融入 OOP 设计原则。
此外,我认为您的继承层次结构没有多大意义。
查看有关多态性的 MSDN 指南,这是了解这些基础知识的良好开端:
任何方式?当然可以,但我永远不会这样做。重新考虑您的设计。这是一个非常糟糕的技巧:
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 中的代码太复杂而不想重复它而尝试这样做,那么这样做几乎可以保证您会破坏一些非常糟糕的东西,因为它会改变值myString 在 Parent 中,而 child 正在做这件事。很差。
static
修饰符不适用于子classes。指定静态方法或字段的完整方法是使用 class 名称。在您的示例中,您在两种情况下访问的字段都是 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();
您将看到新字符串。
另请理解,如果您更改静态字段的值,则无论您如何访问它,整个应用程序都会发生更改。您不能让某些情况下使用一个字符串而其他情况下使用另一个。这就是实例值的用途。