如何链接泛型和派生类型

本文关键字:泛型 派生 类型 链接 何链接 | 更新日期: 2023-09-27 18:01:25

我认为我对泛型的理解不够好,无法使我的代码工作,但我找不到一个解释为什么它不起作用。

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

这并不适合我的需要。

有人可以向我解释什么我理解错了,我应该如何继续能够有一个SpecificManager在每个类派生自ControllerBase ?

提前感谢。

问候。

如何链接泛型和派生类型

虽然语法稍长,但下面的代码可以工作:

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