如何将泛型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);
        }
    }

如何将泛型List中同一接口的各种派生类作为参数传递给函数

两个选项:

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>的通用方法。