簡體   English   中英

如何在c#中實現泛型多態?

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

為了避免混淆,我總結了一些代碼:

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()得到一個InvalidCastException。

我知道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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM