Spr*_*gue 3 c# generics inheritance interface covariance
我注意到其他开发人员使用这种技术,但它总是让我困惑.我决定今天上午进行调查,并遇到下列来到MSDN(从http://msdn.microsoft.com/en-us/library/d5x73970(v=vs.100).aspx):
public class GenericList<T> where T : Employee
{
...
}
Run Code Online (Sandbox Code Playgroud)
为什么我们要使用此方法而不是在类中用Employee替换T的所有实例?对我来说,这似乎是可维护性的胜利.我可以理解限制接口作为包含来自不同继承层次结构的类的方法,但是继承已经以更明显的方式解决了上面的问题,不是吗?
这可能被视为一个错误,或者"修复"这样的代码是错误的吗?
因为它可能是从Employee派生的东西.
public class EvilEmployee : Employee {
public Int32 Evilness { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在可以......
GenericList<EvilEmployee> list = GetEvilEmployees();
var mostEvilEmployee = list.OrderByDescending(e => e.Evilness).First();
Run Code Online (Sandbox Code Playgroud)
因为在编译时我们知道T = EvilEmployee并且EvilEmployee具有Evilness属性,所以这是可能的.如果我们要将列表强制转换为不可能的Employee列表(不使用OfType).
为什么我们要使用此方法而不是在类中用Employee替换T的所有实例?
启用:
class Manager : Employee { ... }
var board = new GenericList<Manager> ();
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,您的名称"GenericList"更像是"EmployeeList"
我可以理解限制接口作为包含来自不同继承层次结构的类的方法
类继承和接口有很多共同之处.
但是继承已经以更明显的方式解决了上面的问题,不是吗?
是的,但它不一样.board.Add(lowlyProgrammer);
这将失败,而继承将允许它.