【问题标题】:c# circular generic type parametersc# 循环泛型类型参数
【发布时间】:2017-04-09 19:54:02
【问题描述】:

我有 2 个通用类:ManagerBase 类和 ChildBase 类。 它们都是抽象的,旨在具体化。 ManagerBase 有一个 ChildBase 列表,这就是为什么我想让它成为通用的,所以 CatalogManager : ManagerBase 会有一个目录列表。此外,每个目录都将引用其管理器 - CatalogManager。

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; }
}

如何解决这个对象模型?

谢谢。

【问题讨论】:

  • public class ManagerBase&lt;TManager, TChild&gt; where TManager : ManagerBase&lt;TManager, TChild&gt; where TChild : ChildBase&lt;TManager, TChild&gt;, public class ChildBase&lt;TManager, TChild&gt; where TManager : ManagerBase&lt;TManager, TChild&gt; where TChild : ChildBase&lt;TManager, TChild&gt;, class CatalogManager : ManagerBase&lt;CatalogManager, Catalog&gt;, class Catalog : ChildBase&lt;CatalogManager, Catalog&gt;.

标签: c# generics inheritance circular-dependency


【解决方案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,但我认为这有点令人困惑。我本来希望每个都使用M 和C。

这样做的主要缺点是您必须使用讨厌的(C)(object)this 双重演员才能完成这项工作。 C# 不允许此模式的完全类型安全。邪恶的开发人员可以创建可以破坏模式的子类。

那么具体的类可以是这样的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    相关资源
    最近更新 更多