抽象类中的静态函数

时间:2012-11-20 12:37:37

标签: c# class inheritance

我有一个抽象的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();

抽象类是否可以这样?

2 个答案:

答案 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();