如何在调用基类的静态函数之前设置派生的静态成员?
本文关键字:设置 派生 静态成员 静态函数 调用 基类 | 更新日期: 2023-09-27 18:02:22
我有以下类:
class Base<T> where T : Base<T>
{
protected static string Source;
public static List<T> Read()
{
return GetResource(Source);
}
}
我希望这个类作为基类的功能,但每个派生类必须有一个不同的源。我的问题是,我不能保证在调用Read之前设置了Source。我知道我可以询问源是否在GetResource被调用之前设置,但这不是重点。我需要在调用类的任何静态成员之前设置它。
泛型形参不能有静态成员,所以我不能从静态成员中取出它。
我尝试在派生类的静态构造函数中设置源,但这只会在我调用派生类而不是基类中的成员时被调用。
我尝试在静态Base构造函数中使用一个可重写的方法,但是这样的方法也必须是静态的,并且静态方法不能被覆盖。
当我手动设置Source时,有可能Read-Function已经被调用,所以我必须在Source被调用之前设置。
我知道我可以给Source作为Read的参数,但我希望Read不带参数使用。
是否有任何方法可以确保在调用类的任何其他成员之前设置源,以便任何依赖代码在派生类中,而不必由使用派生类的任何人调用?
我想让它像这样工作:
class Derived : Base<Derived>
{
// somehow set Source
Source = "This is my source";
}
class User
{
private List<Derived> MyResources;
public User()
{
MyResources = Derived.Read();
}
}
注意:源基本上是一个SQL语句,所以一个属性或类似的东西是不够的,我认为
好了,我找到答案了。它不像我希望的那么漂亮,但这是我能想出的最好的了。
我将使用一个接口来强制T的实例具有提供我的源的特定方法。
interface ISource
{
string GetSource();
}
然后在我的基类中实现它,如下所示:
class Base<T> where T : Base<T>, ISource, new()
{
public static List<T> Read()
{
// here I create an Instance to be able to call the Methods of T
string source = (new T()).GetSource();
return GetResource(source);
}
}
派生类:
class Derived : Base<Derived>, ISource
{
public string GetSource()
{
return "This specific source";
}
}
用法如下:
class User
{
public User()
{
List<Derived> myResources = Derived.Read();
}
}
这当然会导致派生的每个实例都具有GetSource-方法,但对于我的场景来说这不是什么大问题。此外,由于它在Read-方法中创建了一个实例,这可能会耗费时间,具体取决于Derived的构造函数。在我的场景中,它只有标准构造函数。
请谨慎使用。