【问题标题】:How to chain generics and derived types?如何链接泛型和派生类型?
【发布时间】:2014-06-19 05:45:35
【问题描述】:

我认为我对泛型的理解不足以让我的代码工作,但我找不到解释为什么它不起作用。

我有这个通用抽象类Repository

public abstract class RepositoryBase
{
}

我必须将它实例化为 SpecificRepository

public class SpecificRepository : RepositoryBase
{
}

现在,我有了这个通用抽象类 ManagerBase,它使用必须从 RepositoryBase 派生的泛型类型:

public abstract class ManagerBase<T> where T : RepositoryBase
{
    public T repository;

    protected ManagerBase(T repository)
    {
        this.repository = repository;
    }
}

我必须用 SpecificManager 实例化:

public class SpecificManager : ManagerBase<SpecificRepository>
{
    public SpecificManager(SpecificRepository repostRepository) : base(repostRepository)
    {

    }
}

这样,我可以在从 ManagerBase 派生的每个类中都有一个从 RepositoryBase 派生的类。

但我不能有一个 ControllerBase 和一个 SpecificController 例如:

public class ControllerBase<T> where T : ManagerBase<RepositoryBase>
{
    public T manager;

    protected ControllerBase(T manager)
    {
        this.manager = manager;
    }
}

public class SpecificController : ControllerBase<SpecificManager>
{
    public SpecificController(SpecificManager manager) : base(manager)
    {

    }
}

看来我可以做到:

public abstract class ControllerBase<T> where T : ManagerBase<SpecificRepository>
{
    public T manager;

    protected ControllerBase(T manager)
    {
        this.manager = manager;
    }
}

public class SpecificController : ControllerBase<SpecificManager>
{
    public SpecificController(SpecificManager manager) : base(manager)
    {

    }
}

这不符合我的需要。

有人可以向我解释我理解的错误以及我应该如何继续能够在从 ControllerBase 派生的每个类中拥有一个 SpecificManager ? p>

提前致谢。

问候。

【问题讨论】:

  • 假设您有一个泛型类型G&lt;T&gt;(因此,有一个类型参数称为T)。进一步假设您还有两种类型,T1T2,并且这些类型之间具有某种形式的继承关系。仅仅因为它们具有这种继承关系,那 not 是否意味着 G&lt;T1&gt;G&lt;T2&gt; 类型具有那种 same 关系。事实上,G&lt;T1&gt;G&lt;T2&gt; 类型之间没有继承关系。

标签: c# oop generics derived-class


【解决方案1】:

以下内容可以使用,尽管语法稍长:

public class ControllerBase<TManager, TRepository>
   where TManager : ManagerBase<TRepository>
   where TRepository : RepositoryBase
/* */

public class SpecificController : ControllerBase<SpecificManager, SpecificRepository>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2011-10-09
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多