我可以将静态访问移动到基类吗
本文关键字:基类 移动 访问 静态 我可以 | 更新日期: 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;
}
}