【发布时间】:2013-06-16 00:47:49
【问题描述】:
我有一个带有静态字段和静态函数的类,例如像这样
public class A {
protected static string[] _eventField = new[] { "SomeValue" };
public static TOut DoSomethingThatDependsOnEventField(TIn input){
//output depends on input and the static _eventField
}
public class Nested1: A {
protected new static string[] _eventField = new[] { "SomethingDifferent" };
}
public class Nested2 : A {
protected new static string[] _eventField = new[] { "SomethingElse" };
}
}
该静态方法的输出和输入类型在这里并不重要,唯一相关的是输出——当然,尽管依赖于输入——取决于静态字段的内容。该方法的实现在派生类中根本没有改变,我想要的只是改变那个非常静态的字段。但每当我打电话给
var res1 = A.Nested1.DoSomethingThatDependsOnEventField(...);
或 var res2 = A.Nested2.DoSomethingThatDependsOnEventField(...);
从方法中引用了基类 A 中不正确的静态字段。
也就是说,通过protected new static string[] _eventField = ... 对静态字段的预期“隐藏”/“重新定义”不起作用 - 为什么会这样?
【问题讨论】:
-
为什么要使用嵌套静态类?
-
@Romoku 为什么不呢?只是为了方便,当类没有嵌套时,您是否期望有不同的行为? (它的行为没有任何不同的 afaik)。
-
“重复”标记器中的某个人能否评论一下为什么他们认为这是问题248263 的重复?我不是在问“虚拟化”静态方法,我问的只是改变这个静态方法正在操作的数据。
-
事实上,在修补了一段时间之后,我想我找到了一个“解决方法”来解决你可能无法重新定义静态字段的奇怪事实。我会发布一些代码,但我认为“重复”标签会阻止我“为我自己的问题添加答案”。基本上,它归结为这样一个事实,通过“new”关键字重新定义字段似乎不会“隐藏”类 A 中的字段。但是,您可以做的是通过派生类中的“new”重新定义静态方法和在调用“return A.DoSomethingThatDependsOnEventField(..)”之前设置“A._eventField = new[] {“SomethingDifferent”}”
标签: c# .net static static-members member-hiding