如何将泛型List中同一接口的各种派生类作为参数传递给函数
本文关键字:派生 函数 参数传递 泛型 List 接口 | 更新日期: 2023-09-27 18:00:07
如何将具有不同继承类的List传递给函数的父接口List?编译器生成一个错误。
public interface ControlPoint
{
}
public class Knot: ControlPoint
{
}
public class Node: ControlPoint
{
}
class Spline
{
List<Knot> knots=new List<Knot>();
List<Node> nodes=new List<Node>();
void Calculate(List<ControlPoint> points) {} //<------- Compiler Error
void Test()
{
Calculate(knots);
Calculate(nodes);
}
}
两个选项:
1) 如果您使用的是C#4和.NET 4+,并且只需要对Calculate
中的点进行迭代,那么只需将签名更改为:
void Calculate(IEnumerable<ControlPoint> points)
这将使用通用协方差。
2) 你可以使方法通用:
void Calculate<T>(List<T> points) where T : ControlPoint
一般来说,我更喜欢第一个-即使您不使用.NET 4/C#4,如果您可以将Calculate
更改为使用IEnumerable<T>
而不是List<T>
,那会更干净-所以您可以将两者混合,并使用IEnumerable<T>
的通用方法。