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