我可以有一个基类,每个派生类都有自己的静态属性副本吗?

nts*_*sue 5 c# inheritance base-class derived-class

我有以下情况如下:

class Base
{
     public static int x;
     public int myMethod()
     {
          x += 5;
          return x;
     }

}

class DerivedA : Base
{
}

class DerivedB : Base
{
}
Run Code Online (Sandbox Code Playgroud)

我试图设置它,以便每个派生类都有自己的静态x实例,如果我做这样的事情:

 DerivedA.x = 5;
 DerivedB.x = 10;
Run Code Online (Sandbox Code Playgroud)

然后当我跑:

 DerivedA.myMethod(); //The result will be 10
 DerivedB.myMethod(); //The reusult will be 15
Run Code Online (Sandbox Code Playgroud)

我可以这样做吗?如何设置派生类来实现这一目标?多谢你们.

编辑:基本上,我有一堆派生类,每个类都有一个该类独有的属性.它不会因每个实例而异,因此我认为应该是一个静态变量.此外,该属性由方法设置,对于每个类都是相同的.我试图避免在每个派生类中复制和粘贴该属性和方法的逻辑.我认为最好以某种方式将该逻辑移动到从中派生每个类的基类.但是,我需要每个派生类都有自己的属性副本.我不一定要这样做,如果你们有任何好的话,我会很高兴听到一些更好的做法建议..谢谢!

ang*_*son 10

好吧,是的,你可以,但它围绕着泛型的一些技巧.

如果你修改你的设计以便你不需要那个静态字段,或者至少不是每个后代,那就更好了,但是这里有:

class Base<TDescendant>
    where TDescendant : Base
{
     public static int x;
     public int myMethod()
     {
          x += 5;
          return x;
     }

}

class DerivedA : Base<DerivedA>
{
}

class DerivedB : Base<DerivedB>
{
}
Run Code Online (Sandbox Code Playgroud)

这取决于具有静态字段的泛型类型将为您调用它的每种类型获取这些静态字段的单独副本.

但是,如果您打算从DerivedA或DerivedB下载,它会变得棘手,因此我不建议沿着这条路走下去.


Fem*_*ref 5

您需要在所有派生类型中重新定义和隐藏字段和方法.

例:

class DerivedA : Base
{
  public new static int x;
  public new int myMethod()
  {
    x += 5;
    return x;
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:不要这样做.修复你的设计.

编辑:

实际上,我有一个类似的结构.我用一个抽象(如果你需要一个默认值,使用virtual)属性解决它,然后从基类中使用它:

public abstract class Base
{
   public abstract string Name { get; }

   public void Refresh()
   {
     //do something with Name
   }
}

public class DerivedA
{
  public override string Name { get { return "Overview"; } }
}
Run Code Online (Sandbox Code Playgroud)

您应该能够针对您的用例进行调整.protected如果只有派生类应该能够看到它,你当然可以创建属性.