关键词搜索

源码搜索 ×
×

C# where泛型约束

发布2015-01-18浏览2333次

详情内容

        最近无意中看到了:http://msdn.microsoft.com/zh-cn/library/bb384067.aspx。但是,人笨啊,木有看懂到底是啥意思,木办法自己写一个试试吧,权当做个笔记哭

例子如下:

接口:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace WhereTest
  6. {
  7. /// <summary>
  8. /// 水果接口
  9. /// </summary>
  10. public interface IFruit
  11. {
  12. //水果名称
  13. string FruitName
  14. {
  15. get;
  16. set;
  17. }
  18. string GetName();
  19. /*接口中只能包含方法、属性、索引器和事件的声明。
  20. * 不允许声明成员上的修饰符,即使是pubilc都不行,因为接口成员总是公有的,也不能声明为虚拟和静态的。
  21. * 如果需要修饰符,最好让实现类来声明。
  22. */
  23. }
  24. }


接口实现:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace WhereTest
  6. {
  7. /// <summary>
  8. /// 梨子类
  9. /// </summary>
  10. public class Peach : IFruit
  11. {
  12. //无参、公共 构造函数
  13. public Peach()
  14. {
  15. }
  16. private string fruitName;
  17. string IFruit.FruitName
  18. {
  19. get
  20. {
  21. return this.ToString(); ;
  22. }
  23. set
  24. {
  25. fruitName = value;
  26. }
  27. }
  28. string IFruit.GetName()
  29. {
  30. return string.IsNullOrEmpty(fruitName) ? "木有找到名字" : fruitName;
  31. }
  32. }
  33. }

创建一个带有泛型约束的类:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace WhereTest
  6. {
  7. /// <summary>
  8. /// 带有泛型约束的类
  9. /// </summary>
  10. /// <typeparam name="T"></typeparam>
  11. public class FruitMarket<T>
  12. where T : IFruit,
  13. new()//new()的意思是,这个T必须有public构造函数
  14. {
  15. T item = new T();
  16. public void FruitSayHello()
  17. {
  18. item.FruitName = "我是梨子";
  19. Console.WriteLine("你好:" + string.Format("Fruit:{0}", item.GetName()));
  20. Console.ReadKey();
  21. }
  22. /*在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。
  23. * 如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。*/
  24. }
  25. }

由于有where字句的泛型约束,所以,创建FruitMarket的对象时,T的类型只能是继承自IFruit接口的类。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace WhereTest
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. //实例化之后 只能在static方法中调用相应的方法,否则 根本找不着peach变量
  12. FruitMarket<Peach> peach = new FruitMarket<Peach>();
  13. peach.FruitSayHello();
  14. }
  15. }
  16. }

运行结果:


本文仅仅是一个用法案例,具体的详细内容,请参照:http://blog.csdn.net/jiankunking/article/details/42876587

测试代码如下:http://download.csdn.net/detail/xunzaosiyecao/8461671

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载