当参数类型为基类时将派生类传递给方法

时间:2019-08-19 13:03:29

标签: c# inheritance polymorphism derived-class

This似乎回答了我的问题,但出现错误。似乎有一个非常简单的解释,但我无法为自己的生活找出原因。

这是经典的多态性继承问题...
我有一个基础课

public abstract class Client
{
    public int Start;
    public int End;
}

和两个继承类

public class Family : Client { }
public class Helper : Client { }

我在此列表中插入了一些值

static List<Family> familySchedule = new List<Family>();

并创建一个接受客户端的方法

static void SortEarlyToLate(List<Client> clientList)
{
    //some code doing stuff like changing Client.Start
}

现在,当我打电话

SortEarlyToLate(familySchedule);

我遇到错误

  

参数1:无法从“ System.Collections.Generic.List ”转换为“ System.Collections.Generic.List

根据问题referenced at the top of this question,这应该可以工作。 我只能想到为什么它不起作用的唯一可能性是,多态性不支持在传入派生类时在方法内部使用基类的对象。即,当方法是传入的家庭。

如果是正确的话,是否没有办法创建可以处理不同类型的通用方法?
(难道不是为此创造了多态吗?) 还是唯一使用相同参数两次创建相同方法的解决方案?

如果我确实错过了一个非常明显的解决方案,请保持友善...我为此一直努力了很长时间,我的大脑已经完全模糊了。

编辑: 我的问题的更简洁的总结是:尽管有一种允许通用参数的方法,例如
static void SortEarlyToLate<T>(List<T> clientList) where T : Client
这会阻止从方法内部访问对象属性的能力。现在,Family.Start将返回错误,Client.Start也将返回错误。我不太确定不会返回什么错误。 除非有聪明的人回答,否则我认为当前唯一的解决方案是将所有参数解析为Client。

1 个答案:

答案 0 :(得分:1)

您可以看到此C# Cannot convert from IEnumerable to IEnumerable

要绕过此问题,您有2个choix:

-在传递给方法之前,将您的列表作为Client的列表

SortEarlyToLate(familySchedule.Cast<Client>().ToList());

-初始化客户列表并添加Family对象。

static List<Client> clientSchedule = new List<Client>();
clientSchedule.Add(new Family());