2017-04-09 97 views
0

我有2个泛型类:一个ManagerBase类和一个ChildBase类。 它们都是抽象的,旨在使其具体化。 ManagerBase有一个ChildBase的列表,这就是为什么我想使它具有通用性,因此CatalogManager:ManagerBase将拥有一个Catalogs列表。另外,每个目录都会引用其'Manager - CatalogManager'。c#圆形泛型类型参数

public class ManagerBase<T1> : ChildBase<???> 
{ 
    public ManagerBase() 
    { 
     ChildObjects = new List<T1>(); 
    } 

    public List<T1> ChildObjects { get; set; } 
} 

public class ChildBase<T1> : ManagerBase<???> 
{ 
    public ChildBase(T1 parentMgr) 
    { 
     ParentMgr = parentMgr; 
     ParentMgr.ChildObjects.Add(this); 
    } 

    public T1 ParentMgr { get; set; } 
} 

如何解决此对象模型?

谢谢。

+0

'公共类ManagerBase 其中TManager:ManagerBase 其中年掳:ChildBase ','公共类ChildBase 其中TManager:ManagerBase 其中,TChild:ChildBase ','class CatalogManager:ManagerBase <目录管理器目录>'类目录:ChildBase <目录管理器目录>'。 – PetSerAl

回答

1

你必须定义使用“好奇递归”模式的基类:

public class ManagerBase<M, T1> 
    where M : ManagerBase<M, T1> 
    where T1 : ChildBase<M, T1> 
{ 
    public ManagerBase() 
    { 
     ChildObjects = new List<T1>(); 
    } 

    public List<T1> ChildObjects { get; set; } 
} 

public class ChildBase<T1, C> 
    where T1 : ManagerBase<T1, C> 
    where C : ChildBase<T1, C> 
{ 
    public ChildBase(T1 parentMgr) 
    { 
     ParentMgr = parentMgr; 
     ParentMgr.ChildObjects.Add((C)(object)this); 
    } 

    public T1 ParentMgr { get; set; } 
} 

请注意我坚持你的T1的用法,但我认为这是一个有点混乱。我本来希望每个都使用MC

与此相关的一个主要缺点是,您必须使用(C)(object)this这个令人讨厌的双重阵容来完成这项工作。 C#不支持这种模式的完整类型安全。一个邪恶的开发者可以创建可以打破模式的子类。

然后具体的类可以是这样的:

public class CatalogManager : ManagerBase<CatalogManager, Catalog> 
{ 
} 

public class Catalog : ChildBase<CatalogManager, Catalog> 
{ 
    public Catalog(CatalogManager parentMgr) : base(parentMgr) 
    { 
    } 
}