2017-08-24 119 views
2

我知道类似的问题在这里经常被问到,但我一直在寻找一些处理我遇到的问题的东西。抽象类的静态方法

我正在构建一个应用程序,并为'Team','Manager'和'Employee'分别设置了三个类。我意识到我为所有三个代码重复了很多代码,所以我定义了一个名为'Worker'的抽象类。

在每个班的我已经定义了一个GetAllX方法,返回和IEnumerable<X>,例如:

public static IEnumerable<Manager> GetAllManagers() 
{ 
    //Code to get all managers 
    yield return m 
    //find next manager and loop 
} 

我要的是能够在我的抽象类定义一个方法叫做GetAll这将返回T类型的IEnumerable,其中T是从我的抽象类继承的类。有没有办法实现这样的事情?

+6

有时我很遗憾堆栈溢出不会接受“否”作为完整的评论。 –

+2

忘掉静态的废话并创建抽象的'GetAll'并实现它。 – FCin

+3

为什么名为Manager的类有一个名为GetAllMangers的方法?你正在混合太多的东西 – sam

回答

0

从技术上讲,你可以做

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

从技术上讲,你可以做到这一点,但在我看来,传统的仓库是方法更适合。

+0

这是超级接近!我希望能够在每个Class中定义一个静态变量,我需要调用'GetAll',并且能够在查询中使用该静态变量,我将实际运行它们的'GetAll'。使用这种方法,我可以打开'typeof(T)',它包含在我喜欢的worker类中,我最终只用三个单独命名的方法编写了一个单独的静态类,因为它不是那么多的代码复制。虽然谢谢! –

+0

“我可以打开'typeof(T)'” - _请不要那么做,那就像你没有按照他们应该使用的方式使用类一样! – CompuChip