简体   繁体   English

如何在c#中实现泛型多态?

[英]How to implement generic polymorphism in c#?

to avoid confusion I summarised some code: 为了避免混淆,我总结了一些代码:

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

When I debug the code I get an InvalidCastException in Main() . 当我调试代码时,我在Main()得到一个InvalidCastException。

I know that ISpecificEntity implements IIdentifier . 我知道ISpecificEntity实现了IIdentifier But obviously a direct cast from an IManager<ISpecificEntity> into an IManager<IIdentifier> does not work. 但显然从IManager<ISpecificEntity>转换为IManager<IIdentifier>不起作用。

I thought working with covariance could do the trick but changing IManager<TIdentifier> into IManager<in TIdentifier> does not help either. 我认为使用协方差可以解决问题,但将IManager<TIdentifier>更改为IManager<in TIdentifier>也无济于事。

So, is there a way do cast specificManager into an IManager<IIdentifier> ? 那么,有没有办法将specificManager转换为IManager<IIdentifier>

Thanks and all the best. 谢谢,一切顺利。

With IManager<IIdentifier> you can do such thing: 使用IManager<IIdentifier>您可以执行以下操作:

IIdentifier entity = new NotSpecificEntity();
manager.DoStuffWith(entity);

That will lead to exception, in your SpecificEntityManager , because it accepts only parameters of type ISpecificEntity 这将在您的SpecificEntityManager导致异常,因为它只接受ISpecificEntity类型的参数

UPDATE: You can read more about covariance and contravariance in C# at Eric Lippert's blog 更新:您可以在Eric Lippert的博客中阅读有关C#中的协方差和逆变的更多信息

Why not: 为什么不:

ISpecificEntity bankAccountManager = new SpecificEntity();
IManager<IIdentifier> manager = (IManager<IIdentifier>)bankAccountManager;
manager.DoStuffWith(new SpecificEntity());

?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM