我可以将静态访问移动到基类吗

本文关键字:基类 移动 访问 静态 我可以 | 更新日期: 2023-09-27 18:19:32

我有一个基类和派生类,比如:

public abstract class MyBase
{
   protected string _data;
   protected string GetData_Internal() {return _data;}
   protected abstract void SetData(string data);
}
public class MyDerived : MyBase
{
   protected override void SetData(string data) {_data = "my data";}
   public static string GetData()
   {
      var instance = new MyDerived();
      return instance.GetData_Internal();
   }
}

该类的预期用途如下:

string data1 = MyDerived.GetData();
string data2 = MyDerived2.GetData(); // another class dervied from MyBase

我不能使类成为静态的,因为静态类和派生类在一起不能很好地发挥作用。因此,我将函数GetData()设置为静态的,这样我就可以随心所欲地使用这个类

除了在SetData()中设置的数据值之外,我将拥有多个与MyDerived完全相同的类。

我想将GetData()从派生类移到基类中,这样就不会在每个派生类中重复该代码。

我不知道如何做到这一点,因为基类中的静态方法不知道要新建什么类型的对象。

那么,有没有什么方法可以做我正在尝试做的事情,保持与类的静态交互,同时避免代码重复以实现它?

我可以将静态访问移动到基类吗

如果您使用的是静态数据,那么您可能需要的是只能实例化一次的单例对象。它们的优点是支持继承和接口实现,并且可以静态访问。此外,与静态类不同,它们可以作为参数传递给方法,并存储在字段、属性和变量中。

您可以使用属性而不是getter和setter方法。这简化了您的基类:

public abstract class MyBase
{
    public string Data { get; set; }
}

您可以实现这样的单例模式:

public class MyDerived : MyBase
{
    #region Singleton Pattern
    public static readonly MyDerived Instance = new MyDerived();
    private MyDerived()
    {
    }
    #endregion
}

创建一个返回类的唯一实例的公共静态只读字段,并将构造函数设为私有,以禁止在类本身之外创建实例。如果需要,构造函数还可以初始化Data的值。

你可以像这样使用单身汉:

MyDerived.Instance.Data = "my data";
string data = MyDerived.Instance.Data;
MyDerived2.Instance.Data = "my data 2";
...

另请参阅:在C#中实现Singleton,了解实现Singleton模式的各种方法。

首先,我不完全确定您想要实现什么。因此,我不评论这是否是一个好主意。您可以获得一些行为,这些行为有点像带有statics的基类上的重写方法。相反,你可以覆盖基,然后调用它

public class Dog
{
    public static Dog GetById(int dogId) 
    { 
        //Return dog 
    }
}
public class Lab : Dog
{
    public new static Lab GetById(int dogId) 
    { 
        //Return same dog, as a lab 
    }
}

一个快速而糟糕,但希望有用的版本可能如下所示。如果我能更好地理解你的意图,我也许能把它变成实用的东西。

public abstract class MyBase
{
    public static string GetData()
    {
        return "BASE STUFF";
    }
}
public class MyDerivedA : MyBase
{
    protected const string MySpecialData = "AAAAAA";
    public new static string GetData()
    {
        return MyBase.GetData() + MySpecialData;
    }
}
public class MyDerivedB : MyBase
{
    protected const string MySpecialData = "BBBBBBB";
    public new static string GetData()
    {
        return MyBase.GetData() + MySpecialData;
    }
}