C#中派生类的协方差

时间:2014-01-30 23:41:06

标签: c# generics inheritance covariance

我有以下代码(准备粘贴到linqpad)。基本上有一个基础“模型”类,其中包含一个“treemembermodel”类。

class MemberModel
{
    public List<Member> Team = new List<Member>();

    public void IncreaseAge()
    {
        // Would like this to modify the Treemember
        Team[0].Age++;
    }
}

class TreeMemberModel : MemberModel
{
    public new List<TreeMember> Team = new List<TreeMember>();

    public void UpdateName(string newName)
    {

    }
}

具有源自它的“TreeMember”的成员类相同。

public class Member
{
    public string Name;
    public int Age;
}

public class TreeMember: Member
{
    public string ParentName;
}

这个想法是基本成员模型存储正常成员列表,而“树”模型(和成员)类通过维护父和从属字段之间的完整性来确保“树”结构。

这一切似乎都是个好主意(以下示例是程式化的) - 我认为应用于两种对象类型的任何“常见”方法(例如下面的“增加”)将在从该模型调用时修改TreeModel中的treeMember。但是,在我的main方法中调用'increaseage'会改为尝试从基础'MemberModel'访问'Team'集合,这当然不存在。

void Main()
{
    TreeMemberModel t = new TreeMemberModel();
    t.Team.Add(new TreeMember() { Name = "original", Age = 10 });

    // Call method within derived class
    t.UpdateName("changed");
    Console.WriteLine (t.Team[0].Name);

    // Call method which drops down to base class method, and would like it to modify the TreeMemberModel's Team collection, not MemberModel's.
    t.IncreaseAge();
    Console.WriteLine (t.Team[0].Age);
}

我认为这是一个协方差问题,并尝试了一些关于使类通用的事情等等。我可以配置它,以便在操作TreeModel集合的元素时回退到基类的方法吗?

1 个答案:

答案 0 :(得分:1)

您应该尝试以下操作:

class MemberModel<TMember> where TMember : Member
{
    public List<TMember> Team = new List<TMember>();

    public void IncreaseAge()
    {
        // Would like this to modify the Treemember
        Team[0].Age++;
    }
}

class TreeMemberModel : MemberModel<TreeMember>
{
    public void UpdateName(string newName)
    {

    }
}