我有一个抽象的C#类,它通过许多类继承,我希望在泛型类中添加一个静态函数。
public abstract class A<T>: where T
{
protected A()
{
// setup class A
}
public List<T> GetResult()
{
return new List<String>();
}
}
public class B : A<String>
{
public string FooBar()
{
// do something
}
}
现在,我想在抽象类A
中添加一个静态类pulic static List<T> GetResults()
{
var foo = new A();
return foo.GetResult();
}
现在,我想通过继承的类
调用新的静态函数B.GetResults();
抽象类是否可以这样?
答案 0 :(得分:3)
您的问题不明确,因为您提供的代码在很多方面都无效。但是,可以在抽象通用基类中创建一个静态方法,并且可以通过“派生类型的名称”调用它......但它不是特别的这样做很有用。
所以这段代码可行:
using System;
public abstract class A<T> where T : new()
{
public static T CreateInstance()
{
return new T();
}
}
public class B : A<int>
{
}
class Test
{
static void Main()
{
Console.WriteLine(B.CreateInstance());
}
}
...但是对B.CreateInstance()
的调用完全等同于:
A<int>.CreateInstance();
......事实上,这就是它编译的内容。
一般情况下,我会强烈建议不要通过派生类访问静态成员。如此相似,而不是写ASCIIEncoding.ASCII
,我建议写Encoding.ASCII
- 它更清楚你正在使用的是什么。
现在这是否真的解决了你的问题是另一回事 - 目前还不清楚,因为你还没有真正解释你想要实现的目标,只有你尝试的方式实现它。
答案 1 :(得分:1)
你可以试试这个:
public abstract class A<T, TSelf> // TSelf name just to clarify here
where TSelf : A<T, TSelf>, new()
{
public abstract List<T> GetResult();
public static List<T> GetResults()
{
var foo = new TSelf();
return foo.GetResult();
}
}
public class B : A<String, B>
{
public override List<String> GetResult()
{
// Do something....
}
}
现在你可以致电:
List<String> results = B.GetResults();