3

異なる継承されたクラスを持つリストを関数に渡す方法は、親インターフェイスのリストを受け取りますか? コンパイラはエラーを生成します。

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

    }
4

1 に答える 1

8

2 つのオプション:

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>

于 2013-02-18T09:50:59.183 に答える