使用父类调用一个方法而不是使用子类调用两个方法

时间:2018-03-28 07:24:00

标签: c#

我有课程:

public class Throw
{
    public double speed { get; set; }

    public double accurency { get; set; }
}
public class FastThrow : Throw{}

public class LowThrow : Throw{}

而不是:

public static FastThrow SetFastThrow(List<object> args)
{
    return new FastThrow
    {
        speed = (double)args[0],
        accurency = (double)args[1]
    };
}

public static LowThrow SetLowThrow(List<object> args)
{
    return new LowThrow
    {
        speed = (double)args[0],
        accurency = (double)args[1]
    };
}

我希望有一个父类:

public static Throw SetThrow(List<object> args)
{
    return new Throw
    {
        speed = (double)args[0],
        accurency = (double)args[1]
    };
}

使用具有父类实例的子类声明列表或其他通用接口。然后向现有集合添加新元素。我知道下面的例子有编译错误,但它应该看起来像:

List<List<object>> firstList = new List<List<object>>();
public void Main()
{
    IList<FastThrow> secondList = new List<Throw>();

    foreach (var item in firstList)
    {
        secondList.Add(SetThrow(item));
    }
}

我读到了相反的变化,不知道这是否可能。

1 个答案:

答案 0 :(得分:2)

你不能。 Rahter比

  

使用类声明列表或其他通用接口   类的实例。

应该

  

使用 parent 类声明列表或其他通用接口    chidlren 类的实例。

第二种方式,正如Anirban所说,使用泛型类,重构您的SetThrow方法如下:

    public static T SetThrow<T>(List<object> args) where T : Throw, new()
    {
        return new T
        {
            speed = (double)args[0],
            accurency = (double)args[1]
        };
    }

因此,只要它们是子类,您就可以使用SetThrow方法生成不同类型的类。 e.g:

 IList<FastThrow> secondList = new List<FastThrow>();

            foreach (var item in firstList)
            {
                secondList.Add(SetThrow<FastThrow>(item));
            }

泛型类的强类型和优雅使用。