2017-04-09 99 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) 
    { 
    } 
}