我知道在这里已经经常提出类似的问题,但我一直在寻找一些处理我遇到的问题的事情。
我正在构建一个应用程序,并为“团队”,“经理”和“员工”分别创建了三个类。我意识到我为这三个代码重复了很多代码,所以我定义了一个名为'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是从我的抽象类继承的类。有没有办法实现这样的事情?
答案 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();
从技术上讲,你可以做到,但在我看来,经典的存储库是更合适的方法。