如何添加实现通用接口的集合

时间:2011-10-12 13:17:24

标签: c# inheritance collections interface

我已按以下方式设置了我的课程。 因此,两个集合都实现了一个通用接口 - IChild。

有没有办法让父母的方法返回每个集合的公共部分?

我在下面使用“+”,我知道这不起作用,但它表明我正在尝试做什么。

public interface IChild
{
    DateTime Date { get; }
    Parent Parent { get; set; }
}

public class Boy : IChild
{
    public virtual Parent Parent { get; set; }
    public virtual DateTime GraduationDate { get; set; }
    public virtual DateTime Date { get { return ProcedureDate; } }
}

public class Girl : IChild
{
    public virtual Parent Parent { get; set; }
    public virtual DateTime WeddingDate { get; set; }
    public virtual DateTime Date { get { return ContactDate; } }
}


public Parent
{
    protected IList<Boy> _boys = new List<Boy>();
    protected IList<Girl> _girls = new List<Girl>();

    public virtual IEnumerable<Boy> Boys
    {
        get { return _boys; }
    }

    public virtual IEnumerable<Girl> Girls
    {
        get { return _girls; }
    }

    public virtual IEnumerable<IChild> Children
    {
        get
        {
            return _boys + _girls;
        }
    }
}

由于

4 个答案:

答案 0 :(得分:3)

public virtual IEnumerable<IChild> Children
{
    get
    {
        return _boys.Concat<IChild>(_girls);
    }
}

答案 1 :(得分:2)

您可以使用Cast<T>强制转换为接口,然后使用Concat将一个序列流式传输到另一个接口。

return _boys.Cast<IChild>().Concat(_girls.Cast<IChild>()); // .NET 3.5 and greater

注意:如果您使用的是.NET 3.5,则需要执行此处所示的强制转换。如果您使用的是.NET 4,则可以关注Kristian Fenn's answer并省略代替.Concat<IChild>的强制转换,因为它们在.NET 4版本中提供了IEnumerable<T>协变,这允许{当方法调用IEnumerable<Boy>时,要替换{1}}。

IEnumerable<IChild>

为了完成,如果你仍然使用.NET 2.0,那么这两种方法都不适用,尽管实现自己很简单。

return _boys.Concat<IChild>(_girls); // .NET 4.0 and greater

答案 2 :(得分:0)

在结果集合中,您是否只需要常用元素?

你可以考虑重载+运算符

答案 3 :(得分:0)

public virtual IEnumerable<IChild> Children 
    { 
        get 
        { 
          List<IChild> list = new List<IChild>();
          list.AddRange(Boys);
          list.AddRange(Girls);  
          return list; 
        } 
    }