繁体   English   中英

将 Generic 的实例作为参数发送

[英]Send Instance of Generic as a parameter

我有一个抽象的Group类和一个抽象的Member类。 Group 类有一个名为member的 Member 类的字段(属性),而 Member 有一个名为group的 Group 类的字段。

他们都必须继承这种方式,所以我们必须DerGroupDerMember和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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM