我有以下代码(准备粘贴到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集合的元素时回退到基类的方法吗?
答案 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)
{
}
}