2017-04-09 17 views
0

私は2つのジェネリッククラスを持っています:ManagerBaseクラスとChildBaseクラスです。 これらは抽象的なものであり、具体的に作成されることを意図しています。 ManagerBaseにはChildBaseのリストがあります。そのため、汎用的にしたいので、CatalogManager:ManagerBaseにカタログのリストがあります。また、各カタログは、その '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 TChild:ChildBase '、 'パブリッククラスTChild ここで、TChild:ChildBase 、クラス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) 
    { 
    } 
} 
関連する問題