QQ登录
会员登录
立即注册
设为首页
加入收藏
搜索
搜 索
本版
帖子
用户
首页
新帖
排行榜
首页
新帖
排行榜
登录
新用户注册
注册
登录
知鸟论坛
»
论坛首页
›
软件分享
›
编程源码
›
ASP.NET泛型三之使用协变和逆变实现类型转换 ...
1
2
/ 2 页
下一页
返回列表
查看:
3101
|
回复:
11
[ASP.NET]
ASP.NET泛型三之使用协变和逆变实现类型转换
[复制链接]
Editor
Editor
当前离线
发表于 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
看全部
其实我一直觉得楼主的品味不错!呵呵!
知鸟论坛
太棒了!
回复
使用道具
举报
知足常乐77
知足常乐77
当前离线
发表于 2023-6-29 17:05:06
|
显示全部楼层
知足常乐77
2023-6-29 17:05:06
看全部
这东西我收了!谢谢楼主!
知鸟论坛
真好!
回复
使用道具
举报
462710480
462710480
当前离线
发表于 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
看全部
这东西我收了!谢谢楼主!
知鸟论坛
真好!
回复
使用道具
举报
掌舵的鱼1987
掌舵的鱼1987
当前离线
发表于 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
看全部
楼主发贴辛苦了,谢谢楼主分享!我觉得
知鸟论坛
是注册对了!
回复
使用道具
举报
落败的青春阳落s
落败的青春阳落s
当前离线
发表于 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
看全部
论坛不能没有像楼主这样的人才啊!我会一直支持
知鸟论坛
。
回复
使用道具
举报
下一页 »
1
2
/ 2 页
下一页
返回列表
您可能感兴趣
查看更多
点击右侧快捷回复
选择快捷回复
楼主发贴辛苦了,谢谢楼主分享!
楼主太厉害了!楼主,I*老*虎*U!
这个帖子不回对不起自己!
这东西我收了!谢谢楼主!
我看不错噢 谢谢楼主!
既然你诚信诚意的推荐了,那我就勉为其难的看看吧!
其实我一直觉得楼主的品味不错!呵呵!
感谢楼主的无私分享!
楼主,大恩不言谢了!
楼主,我太崇拜你了!
社区不能没有像楼主这样的人才啊!
【请勿灌水】
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
发新帖
返回列表
回帖后跳转到最后一页
RSS订阅
|
SiteMap
|
小黑屋
|
知鸟论坛
联系邮箱E-mail:zniao@foxmail.com
首页
论坛
登录
注册
导读
快速回复
返回顶部
返回列表
扫一扫,关注我们
下载APP客户端