抽象类的静态方法

时间:2017-08-24 14:52:07

标签: c#

我知道在这里已经经常提出类似的问题,但我一直在寻找一些处理我遇到的问题的事情。

我正在构建一个应用程序,并为“团队”,“经理”和“员工”分别创建了三个类。我意识到我为这三个代码重复了很多代码,所以我定义了一个名为'Worker'的抽象类。

在每个课程中,我定义了一个返回GetAllX的{​​{1}}方法,例如:

IEnumerable<X>

我想要的是能够在我的抽象类public static IEnumerable<Manager> GetAllManagers() { //Code to get all managers yield return m //find next manager and loop } 中定义一个方法,它将返回一个类型为T的IEnumerable,其中T是从我的抽象类继承的类。有没有办法实现这样的事情?

1 个答案:

答案 0 :(得分:1)

从技术上讲,你可以做到

abstract class Worker
{
    public static IEnumerable<T> GetAll<T>() where T : Worker
    {
        //your code
    }
}

class Manager : Worker
{
}

class Employee : Worker
{
}

此方法调用var managers = Worker.GetAll<Manager>();

另一种使用不同静态变量的方法,OP想要的内容如评论中所述。

abstract class Worker<T> where T : Worker<T>
{
    protected static string name;

    public static IEnumerable<T> GetAll() 
    {
        Console.WriteLine(name);
        return Enumerable.Empty<T>();
    }
}

class Manager : Worker<Manager>
{
    static Manager()
    {
        name = "Manager";
    }
}

class Employee : Worker<Employee>
{
    static Employee()
    {
        name = "Employee";
    }
}

并使用

//create object to call static constructors
//this need only once for every concrete class
var test = new Manager();
var test1 = new Employee();

var managers = Worker<Manager>.GetAll();
var employees = Worker<Employee>.GetAll();

从技术上讲,你可以做到,但在我看来,经典的存储库是更合适的方法。