Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何链接泛型和派生类型?_C#_Oop_Generics_Derived Class - Fatal编程技术网

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

C# 如何链接泛型和派生类型?,c#,oop,generics,derived-class,C#,Oop,Generics,Derived Class,我想我对泛型的理解还不足以让我的代码工作,但我找不到解释为什么它不工作 我有一个通用的抽象类存储库: 我必须将其实例化为特定存储库: 现在,我有一个泛型抽象类ManagerBase,它使用一个必须从RepositoryBase派生的泛型类型: 公共抽象类管理器数据库,其中T:RepositoryBase { 公共T库; 受保护的ManagerBase(T存储库) { this.repository=存储库; } } 我必须与SpecificManager联系: 公共类特定管理器:Manager

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

我有一个通用的抽象类存储库:

我必须将其实例化为特定存储库:

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

公共抽象类管理器数据库,其中T:RepositoryBase
{
公共T库;
受保护的ManagerBase(T存储库)
{
this.repository=存储库;
}
}
我必须与SpecificManager联系:

公共类特定管理器:ManagerBase
{
公共SpecificManager(SpecificRepository repostRepository):基础(repostRepository)
{
}
}
这样,在从ManagerBase派生的每个类中都可以有一个从RepositoryBase派生的类

但是我不能有一个ControllerBase和一个特定的控制器,例如:

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 class ControllerBase其中T:ManagerBase
{
公共事务经理;
受保护控制器数据库(T管理器)
{
this.manager=经理;
}
}
公共类特定控制器:ControllerBase
{
公共SpecificController(SpecificManager管理器):基本(管理器)
{
}
}
看来我能做到:

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)
    {

    }
}
public抽象类ControllerBase,其中T:ManagerBase
{
公共事务经理;
受保护控制器数据库(T管理器)
{
this.manager=经理;
}
}
公共类特定控制器:ControllerBase
{
公共SpecificController(SpecificManager管理器):基本(管理器)
{
}
}
但这不适合我的需要

有人能给我解释一下我理解的错误是什么,以及我应该如何在每个类中从ControllerBase派生出一个特定的管理器

提前谢谢


注意。

尽管语法稍长,但以下内容仍适用:

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

public class SpecificController : ControllerBase<SpecificManager, SpecificRepository>
公共类控制器库
其中TManager:ManagerBase
存放地点:RepositoryBase
/* */
公共类特定控制器:ControllerBase

假设您有一个泛型类型,
G
(因此,使用一个名为
T
的类型参数)。进一步假设还有两种类型,
T1
T2
,这些类型之间有某种形式的继承关系。仅仅因为它们具有这种继承关系,这并不意味着类型
G
G
具有相同的关系。实际上,类型
G
G
之间没有继承关系。
public class SpecificManager : ManagerBase<SpecificRepository>
{
    public SpecificManager(SpecificRepository repostRepository) : base(repostRepository)
    {

    }
}
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)
    {

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

public class SpecificController : ControllerBase<SpecificManager, SpecificRepository>