[英]Send Instance of Generic as a parameter
我有一个抽象的Group类和一个抽象的Member类。 Group 类有一个名为member的 Member 类的字段(属性),而 Member 有一个名为group的 Group 类的字段。
他们都必须继承这种方式,所以我们必须DerGroup和DerMember和DerGroup具有DerMember的成员字段和DerMember具有集团级的组字段。
我正在尝试使用泛型。
abstract class Member
{
public Group<Member> group;
public void Init(Group<Member> grp)
{
group = grp;
}
}
abstract class Group<T> where T : Member
{
public T member;
public void InitMember()
{
// Here I have an Error: Can't convert Group<T> to Group<Member>
member.Init(this);
}
}
如果 Group 是 Generic,如何将此Group 实例发送到它的 Member 实例? 我正在使用泛型来继承 Group 和 Member 类并保存它们的关系。 像那样:
class Student : Member {}
class ClassRoom<T> : Group<Member> where T : Student {}
所以我们可以有这个: typeof(ClassRoom.member) = Student ,而不是Member
给我任何有关如何正确声明Member.Init()
函数或完成此操作的帮助。
恐怕你已经去了 GRHOM - 疯狂的通用兔子洞。 如果你环顾四周,你会看到我的爪痕。
这些类之间的关系很难理解,因为它表明一个组只能有一个成员,一个成员只能属于一个组。
看起来你想要做的是循环。 您试图确保组只有一种成员,并且成员仅属于包含仅属于该组成员的成员的组......等等。
问题是,为什么需要双向限制? 鉴于这种:
class Group<T> : Group where T : Member
你已经确保了Group
只能包含Member
或子类Member
-无论T
是,当你定义你的具体类。
那么,为什么一个Member
还需要指定它只能属于只能将其作为成员的组? 该约束已经完成。
假设组必须包含对成员的引用和对组的成员的引用,您可以这样做:
abstract class Member
{
private List<Group> Groups { get; } = new List<Group>();
internal void AddGroup(Group group)
{
Groups.Add(group);
}
}
abstract class Group
{
protected List<Member> Members { get; } = new List<Member>();
}
abstract class Group<TMember> :Group where TMember : Member
{
void AddMember(TMember member)
{
Members.Add(member);
member.AddGroup(this);
}
}
现在,组可以受成员类型的约束,但成员可以引用一组不受约束的组。
避免让成员参考组可能更简单。 如果您想知道成员在哪些组中,请查询组以查看哪些组包含给定成员。
我真的不明白你想用这些类构建什么(我的意思是你的核心业务),但你可以引入一个接口:
abstract class Member
{
public IGroup<Member> group;
public void Init(IGroup<Member> grp)
{
group = grp;
}
}
interface IGroup<T> where T : Member
{
T member { get; set; }
}
abstract class Group<T> : IGroup<Member>
{
public Member member { get; set; }
public void InitMember()
{
member.Init(this);
}
}
class Student : Member { }
class ClassRoom<T> : Group<Student> where T : Student { }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.