首页 > 代码库 > Programming C#.Interfaces
Programming C#.Interfaces
类实现一个接口时,它必须实现该接口的所有部分(方法和属性等),效果相当于类要表明:“我同意履行这个接口所定义的协定。”
从抽象类继承实现了“is-a(是一种)”关系,实现接口时一种“implement(实现)”关系,区别在于:
举个例子:汽车是一种运载工具,它可以实现CanBeBoughtWithABigLoan(可贷巨款购买)这种能力(就像房子一样)
1 /************************************************************************************* 2 * 3 * 1.如果定义一个Document类,这个类可以存储,又可以压缩,所以要同时实现IStorable和ICompressible接口 4 * 2.扩展接口就是用一个新街口扩展原来的接口,通过扩展接口我们表示了这样的意思: 5 * 实现了新接口的任何东西也必须实现原来的接口 6 * 3.组合接口就是将已有的接口组合起来,并且可以增加新的方法或者属性来创建新的接口 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 *************************************************************************************/ 17 using System; 18 19 namespace SimpleInterface 20 { 21 //第一个接口 22 interface IStorable 23 { 24 //接口的方法声明中没有访问修饰符,隐含是public的,因为接口是要有其他类使用的协定 25 void Read(); 26 void Write(Object obj); 27 //属性的声明并未实现get和set方法,只是声明这两个方法 28 int Status { get; set; } 29 } 30 31 //第二个接口 32 interface ICompressible 33 { 34 void Compress(); 35 void Decompress(); 36 } 37 38 //扩展接口 39 interface ILoggedCompressible : ICompressible 40 { 41 //新接口增加了一个新的方法记录节省的字节数 42 void LogSavedBytes(); 43 } 44 45 //组合接口 46 interface IStorableCompressible : IStorable, ILoggedCompressible 47 { 48 //存储压缩前文档的大小 49 void LogOriginalSize(); 50 } 51 52 public class Document : IStorableCompressible 53 { 54 //存储IStorable的Status属性的数据 55 private int status = 0; 56 57 public Document(string s) 58 { 59 Console.WriteLine("Creating Document with:{0}", s); 60 } 61 62 //实现Read方法 63 public void Read() 64 { 65 Console.WriteLine("Implementing the Read Method for IStorable"); 66 } 67 68 //实现Write方法 69 public void Write(Object obj) 70 { 71 Console.WriteLine("Implemeting the Write Method for IStorable"); 72 } 73 //实现属性 74 public int Status 75 { 76 get 77 { 78 return status; 79 } 80 set 81 { 82 status = value; 83 } 84 } 85 86 //实现ICompressible 87 public void Compress() 88 { 89 Console.WriteLine("Implementing Compress"); 90 } 91 public void Decompress() 92 { 93 Console.WriteLine("Implementing Decompress"); 94 } 95 96 //实现ILoggedCompressible 97 public void LogSavedBytes() 98 { 99 Console.WriteLine("Implementing LogSavedBytes");100 }101 102 //实现IStorableCompressible103 public void LogOriginalSize()104 {105 Console.WriteLine("Implementing LogOriginalSize");106 }107 }108 109 //测试接口110 public class Tester111 {112 static void Main()113 {114 Document doc = new Document("Test Document!");115 116 //将Document转换为各种接口进行操作117 IStorable isDoc = doc as IStorable;118 if (isDoc != null)119 {120 isDoc.Read();121 }122 else123 {124 Console.WriteLine("IStorable not supported");125 }126 127 ILoggedCompressible ilcDoc = doc as ILoggedCompressible;128 if (ilcDoc != null)129 {130 //ILoggedCompressible可以调用ICompress接口的方法,因为扩展了该接口131 ilcDoc.Compress();132 ilcDoc.LogSavedBytes();133 }134 else135 {136 Console.WriteLine("ILoggedCompressible not supported");137 }138 139 Console.ReadKey();140 141 }142 }143 }
//将Document转换为各种接口进行操作 IStorable isDoc = doc as IStorable;
这里的意思是如果不确定类是否实现了某个特定的接口,可以使用as操作符进行转换,然后测试转换的结构是否为null,这样就不用冒着引起异常的风险假定已经转换成功了。当然也可以写成这个样子:
IStorable isDoc = (IStorable)doc;
接口与抽象类的比较:
因为C#不支持多继承,所以接口更好些。但是
1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。
Programming C#.Interfaces
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。