我有以下课程:
class Base<T> where T : Base<T>
{
protected static string Source;
public static List<T> Read()
{
return GetResource(Source);
}
}
我希望此类作为其功能的基类,但每个派生类必须具有不同的源。我的问题是我无法确保在调用读取之前设置来源。我知道我可以询问在调用 GetResource 之前是否设置了Source,但这不是重点。我需要在调用我的类的任何静态成员之前设置它。
通用参数不能有静态成员,所以我不能从那里拿走它。
我尝试在派生类的静态构造函数中设置 Source ,但只有当我调用派生类而不是Base中的成员时才会调用它。
我尝试在静态Base构造函数中使用可覆盖的方法,但是这样的方法必须是静态的,并且静态方法不能被覆盖。
当我手动设置Source时,有可能已经调用 Read -Function,因此我必须设置 Source 在它被召唤之前。
我知道我可以将来源作为读取中的参数,但我希望读取在没有参数的情况下使用。
有没有什么方法可以确保在我的类的任何其他成员被调用之前Source被设置,以便任何依赖代码在里面派生类并且不必被任何人调用使用派生类? 我基本上希望它能像这样工作:
class Derived : Base<Derived>
{
// somehow set Source
Source = "This is my source";
}
class User
{
private List<Derived> MyResources;
public User()
{
MyResources = Derived.Read();
}
}
注意:Source基本上是一个SQL语句,所以我认为属性或类似的东西是不够的;
答案 0 :(得分:0)
好的,我找到了答案。它并不像我希望的那样漂亮,但它是我能想到的最好的。
我将使用一个接口来强制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 - 方法,但对于我的方案而言并不是什么大不了的事。 此外,由于它在读取方法中创建了一个实例,因此这可能非常耗时,具体取决于派生的构造函数。在我的场景中,它只有标准的构造函数。
因此请谨慎使用。