搜索

查看: 3101|回复: 11

[ASP.NET] ASP.NET泛型三之使用协变和逆变实现类型转换

[复制链接]
发表于 2023-5-4 11:32:52 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:32:52 3101 11 看全部
".NET泛型"系列:
ASP.NET泛型一之泛型简介与基本语法
ASP.NET泛型二之泛型的使用方法
ASP.NET泛型三之使用协变和逆变实现类型转换
ASP.NET泛型四之使用Lazy实现延迟加载
协变(Convariant)和逆变(Contravariant)的出现,使数组、委托、泛型类型的隐式转换变得可能。 子类转换成基类,称之为协变;基类转换成子类,称之为逆变。.NET4.0以来,支持了泛型接口的协变和逆变。
泛型协变
如果子类泛型隐式转换成基类泛型,使用泛型协变。
有这样的2个基类和派生类。
    public class Animal
    {
        public virtual void Write()
        {
            Console.WriteLine("我是基类");
        }
    }
    public class Dog : Animal
    {
        public override void Write()
        {
            Console.WriteLine("我是小小狗");
        }
    }
为了让派生类Dog隐式转换成基类Animal,先定义支持协变的泛型接口。
    //支持协变的接口
    public interface IFactory
    {
        T Create();
    }
再实现这个接口。
    public class Factory : IFactory
    {
        public T Create()
        {
            return (T)Activator.CreateInstance();
        }
    }
客户端调用。
    class Program
    {
        static void Main(string[] args)
        {
            IFactory dogFactory = new Factory();
            IFactory animalFactory = dogFactory; //协变
            Animal animal = animalFactory.Create();
            animal.Write();
            Console.ReadKey();
        }
    }
运行输出:我是小小狗

以上,我们可以看出:
  • 协变后,父类的方法完全由子类替代,父类原先的方法不复存在
  • 泛型接口中的out关键字必不可少
    泛型逆变
    关于通知的一个接口。
        public interface INotification
        {
            string Message { get; }
        }
    关于通知接口的抽象实现。
        public abstract class Notification : INotification
        {
            public abstract string Message { get; }
        }
    关于通知抽象类的具体实现。
        public class MailNotification : Notification
        {
            public override string Message
            {
                get { return "你有邮件了~~"; }
            }
        }
    接下来,需要把通知的信息发布出去,需要一个发布通知的接口INotifier,该接口依赖INotification,大致INotifier[I],而最终显示通知,我们希望INotifier,INotifier[I]转换成INotifier,这是逆变,需要关键字in。
        public interface INotifier where TNotification : INotification
        {
            void Notify(TNotification notification);
        }
    实现INotifier。
        public class Notifier : INotifier where TNotification : INotification
        {
            public void Notify(TNotification notification)
            {
                Console.WriteLine(notification.Message);
            }
        }
    客户端调用。
        class Program
        {
            static void Main(string[] args)
            {
                INotifier[I] notifier = new Notifier[I]();
                INotifier mailNotifier = notifier;//逆变
                mailNotifier.Notify(new MailNotification());
                Console.ReadKey();
            }
        }
    运行输出:你有邮件了~~

    以上,我们可以看出:
  • INotifier的方法Notify()的参数类型是INotification,逆变后把INotification类型参数隐式转换成了实现类MailNotificaiton。
  • 泛型接口中的in关键字必不可少
    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对知鸟论坛的支持。如果你想了解更多相关内容请查看下面相关链接
  • 回复

    使用道具 举报

    发表于 2023-6-29 14:25:35 | 显示全部楼层
    风来时狂放 2023-6-29 14:25:35 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    发表于 2023-6-29 17:05:06 | 显示全部楼层
    知足常乐77 2023-6-29 17:05:06 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-29 21:30:30 | 显示全部楼层
    462710480 2023-6-29 21:30:30 看全部
    感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
    回复

    使用道具 举报

    发表于 2023-6-30 09:55:08 | 显示全部楼层
    永远就三年疗 2023-6-30 09:55:08 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-30 15:51:24 | 显示全部楼层
    冀苍鸾 2023-6-30 15:51:24 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 22:35:08 | 显示全部楼层
    掌舵的鱼1987 2023-6-30 22:35:08 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-7-3 21:12:00 | 显示全部楼层
    伊索谗言 2023-7-3 21:12:00 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-7-4 23:09:54 | 显示全部楼层
    落败的青春阳落s 2023-7-4 23:09:54 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-7-5 01:46:36 | 显示全部楼层
    井底燕雀傥 2023-7-5 01:46:36 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表