如何在 c# 中实现泛型多态性
本文关键字:实现 泛型 多态性 | 更新日期: 2023-09-27 18:31:35
为了避免混淆,我总结了一些代码:
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
IManager<ISpecificEntity> specificManager = new SpecificEntityManager();
IManager<IIdentifier> manager = (IManager<IIdentifier>) specificManager;
manager.DoStuffWith(new SpecificEntity());
}
}
internal interface IIdentifier
{
}
internal interface ISpecificEntity : IIdentifier
{
}
internal class SpecificEntity : ISpecificEntity
{
}
internal interface IManager<TIdentifier> where TIdentifier : IIdentifier
{
void DoStuffWith(TIdentifier entity);
}
internal class SpecificEntityManager : IManager<ISpecificEntity>
{
public void DoStuffWith(ISpecificEntity specificEntity)
{
}
}
}
当我调试代码时,我在Main()
中得到一个无效的投射异常。
我知道ISpecificEntity
实现了IIdentifier
.但显然,从IManager<ISpecificEntity>
直接投射到IManager<IIdentifier>
是行不通的。
我认为使用协方差可以解决问题,但将IManager<TIdentifier>
更改为IManager<in TIdentifier>
也无济于事。
那么,有没有办法将specificManager
投射到IManager<IIdentifier>
中呢?
谢谢,一切顺利。
有了IManager<IIdentifier>
你可以做这样的事情:
IIdentifier entity = new NotSpecificEntity();
manager.DoStuffWith(entity);
这将导致异常,在您的SpecificEntityManager
中,因为它只接受类型ISpecificEntity
的参数
更新:您可以在 Eric Lippert 的博客中阅读有关 C# 中的协方差和逆变的更多信息
为什么不:
ISpecificEntity bankAccountManager = new SpecificEntity();
IManager<IIdentifier> manager = (IManager<IIdentifier>)bankAccountManager;
manager.DoStuffWith(new SpecificEntity());
?