簡體   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