【问题标题】:Redefine static fields in derived / nested classes in C# [duplicate]在 C# 中重新定义派生/嵌套类中的静态字段 [重复]
【发布时间】: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


【解决方案1】:

不能拥有与静态字段/成员/函数关联的对象,因此静态字段/成员/函数也无法在继承中出现。

【讨论】:

  • 静态字段只是内存中的一个位置,就像非静态字段一样,唯一的区别是它不是每个对象。为什么你认为你实际上不应该能够改变这段记忆的内容?
  • @ 抱歉,如果我没有正确解释,但我从未提到您不能更改静态字段的值。关键是它不能参与继承。
  • 您可能会惊讶于方法的静态继承似乎有效;有关详细信息,请参阅我的其他评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2011-08-16
  • 1970-01-01
相关资源
最近更新 更多