[英]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.