首页 > 代码库 > 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 }
View Code

 

//将Document转换为各种接口进行操作            IStorable isDoc = doc as IStorable;

这里的意思是如果不确定类是否实现了某个特定的接口,可以使用as操作符进行转换,然后测试转换的结构是否为null,这样就不用冒着引起异常的风险假定已经转换成功了。当然也可以写成这个样子:

IStorable isDoc = (IStorable)doc;

接口与抽象类的比较:

因为C#不支持多继承,所以接口更好些。但是

 

1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

Programming C#.Interfaces