C#:基类能否使用派生类';静态函数中的s变量?

C#:基类能否使用派生类';静态函数中的s变量?,c#,C#,在C#中是否有让基类使用派生类的静态变量的方法?大概是这样的: class Program { static void Main(string[] args) { int Result = DerivedClass.DoubleNumber(); Console.WriteLine(Result.ToString()); // Returns 0 } } class BaseClass { public static int

在C#中是否有让基类使用派生类的静态变量的方法?大概是这样的:

class Program
{
    static void Main(string[] args)
    {
        int Result = DerivedClass.DoubleNumber();
        Console.WriteLine(Result.ToString());   // Returns 0
    }
}

class BaseClass
{
    public static int MyNumber;

    public static int DoubleNumber()
    {
        return (MyNumber*2);
    }
}

class DerivedClass : BaseClass
{
    public new static int MyNumber = 5;
}
我试图让它返回10,但我得到0

这里是我使用它的地方:我有一个名为ProfilePictures的类,它带有一个名为GetTempSavePath的静态函数,该函数将用户id作为参数,并返回临时文件的物理路径。path base是一个名为TempPath的静态变量。因为我在多个项目中使用这个类,并且它们有不同的tempPath,所以我创建了一个派生类,将该变量设置为项目的任何路径

另见


提供一个返回类static的虚拟方法

class BaseClass
{
    public virtual int GetMyNumber() { return MyNumber; }
}

您可能希望使用虚拟属性来代替…

提供一个返回类static的虚拟方法

class BaseClass
{
    public virtual int GetMyNumber() { return MyNumber; }
}

您可能希望使用虚拟属性来代替…

问题在于您正在派生类中声明静态变量。DerivedClass中的MyNumber声明隐藏基类中的声明。如果删除该声明,则派生类静态函数中对“MyNumber”的引用将引用基类变量。当然,如果删除声明,则不能在派生类中使用静态初始值设定项

您可能需要考虑要求用户实例化PrimeLePixIt实例,而不是为GETTaveSavePATH提供静态函数。这样,您就可以覆盖GetTempSavePath方法以提供正确的TempPath。或者,您可以简单地在派生类构造函数中设置静态路径值的值


虽然可以对静态成员使用继承,但是如果没有“this”指针,就不能有多态行为。

问题是您在派生类中声明静态变量。DerivedClass中的MyNumber声明隐藏基类中的声明。如果删除该声明,则派生类静态函数中对“MyNumber”的引用将引用基类变量。当然,如果删除声明,则不能在派生类中使用静态初始值设定项

您可能需要考虑要求用户实例化PrimeLePixIt实例,而不是为GETTaveSavePATH提供静态函数。这样,您就可以覆盖GetTempSavePath方法以提供正确的TempPath。或者,您可以简单地在派生类构造函数中设置静态路径值的值


虽然可以对静态成员使用继承,但是如果没有“this”指针,就不能真正具有多态行为。

静态成员不是虚拟的,因此不能重写它们

当您调用
DerivedClass.DoubleNumber
时,实际上是在调用
BaseClass.DoubleNumber
,因为
DerivedClass
类没有该方法。另外,在该方法中使用
MyNumber
始终是
BaseClass.MyNumber
,无论您如何调用该方法


您要寻找的是一个可以在派生类中重写的虚拟属性。由于虚拟成员不能是静态的,因此需要使用该类的实例。如果保留对实例的引用不切实际,可以使用singleton模式。

静态成员不是虚拟成员,因此不能覆盖它们

当您调用
DerivedClass.DoubleNumber
时,实际上是在调用
BaseClass.DoubleNumber
,因为
DerivedClass
类没有该方法。另外,在该方法中使用
MyNumber
始终是
BaseClass.MyNumber
,无论您如何调用该方法


您要寻找的是一个可以在派生类中重写的虚拟属性。由于虚拟成员不能是静态的,因此需要使用该类的实例。如果保留对实例的引用不切实际,可以使用singleton模式。

除了已经指出的事实之外。。。静态变量绑定或绑定到声明它们的特定类,并且不能被重写。重写/多态性需要实例才能工作

你的问题可以通过改变设计来解决

string ProfilePictures.GetTempSavePath(SomeType UserId, string sBasePath)
如果它只需要这两个变量来计算返回值,那么可以将其作为实用程序/静态方法保存。现在您可以输入不同的基本路径

现在,从您的问题来看,您需要在多个项目(具有固定的基本路径)中使用该类,并对基本路径进行某种硬编码,以便不必为每个调用指定它。 类型/类层次结构应基于行为而不是数据定义。变量可以处理数据中的更改。因此,我建议将basepath值作为静态成员变量保存,该变量是从资源文件初始化的(双击项目属性节点>设置>添加新设置文件>添加名为basepath-string-Application scope-value=
C:\Users
)。现在,您只需为每个项目调整app.config文件,无需更改代码,无需硬编码,并且不需要多个类型

public class PathHelper
{
  static string _sBasePath;
  static PathHelper()
  {
     _sBasePath = Properties.Settings.Default.BasePath;
  }

  static string GetTempSavePath(string sUserId)
  {
     // dummy logic to compute return value, replace to taste
     return Path.Combine(_sBasePath, sUserId.Substring(0, 4));
  }
}

除了已经指出的事实之外,希望这是有意义的。。。静态变量绑定或绑定到声明它们的特定类,并且不能被重写。重写/多态性需要实例才能工作

你的问题可以通过改变设计来解决

string ProfilePictures.GetTempSavePath(SomeType UserId, string sBasePath)
如果它只需要这两个变量来计算返回值,那么可以将其作为实用程序/静态方法保存。现在您可以输入不同的基本路径

现在,从您的问题来看,您需要在多个项目(具有固定的基本路径)中使用该类,并对基本路径进行某种硬编码,以便不必为每个调用指定它。 应定义类型/类层次结构