如何链接泛型和派生类型?

时间:2014-05-02 13:52:52

标签: c# oop generics derived-class

我认为我不太了解泛型以使我的代码有效,但我无法找到解释为什么它不起作用。

我有这个通用的抽象类 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

提前致谢。

问候。

1 个答案:

答案 0 :(得分:0)

以下方法可行,但语法稍长:

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

public class SpecificController : ControllerBase<SpecificManager, SpecificRepository>