【发布时间】: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