【问题标题】:Covariance with derived classes in C#与 C# 中的派生类的协方差
【发布时间】:2014-01-30 23:41:06
【问题描述】:

我有以下代码(准备粘贴到 linqpad 中)。基本上有一个基本的“模型”类和一个从它派生的“树成员模型”类。

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

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

这一切似乎都是个好主意(下面的例子是风格化的)——我认为任何适用于两种对象类型的“通用”方法(例如下面的“increaseage”)都会在从该模型调用时修改 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 集合的元素时回退到基类的方法吗?

【问题讨论】:

  • 除非有人有任何进一步的想法,否则我会在一两天内将其关闭为未答复。

标签: c# generics inheritance covariance


【解决方案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)
    {

    }
}

【讨论】:

  • 谢谢 - 我做了上述但它仍然给我一个 ArgumentOutOfRangeException on Team[0].Age++;有什么想法吗?
  • 您实际上在列表中添加了任何内容吗?
  • 是的 - 在 Main() 的开头(如上所示)添加了一个 TreeMember。我没有向模型中添加任何内容(与树模型相反),因为所需的行为是 TreeMember 是被增加年龄()操纵的那个。
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 2015-06-09
  • 2012-03-03
  • 2021-04-30
  • 2012-08-03
相关资源
最近更新 更多