书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn C#接口示例 (第 1 版) http://www.dingos.cn/index.php?topic=763.0 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 1 页 《C#接口基础》 第一章 介绍 ................................................................................................................................... 1 第二章 示例分析 ........................................................................................................................... 1 示例 1(P1.CS): .......................................................................................................................... 1 示例 2(P2.CS): .......................................................................................................................... 1 示例 3(P3.CS): .......................................................................................................................... 2 示例 4(P4.CS): .......................................................................................................................... 2 示例 5(P5.CS): .......................................................................................................................... 3 示例 6(P6.CS): .......................................................................................................................... 3 示例 7(P7.CS): .......................................................................................................................... 4 示例 8(P8.CS): .......................................................................................................................... 4 示例 9(P9.CS): .......................................................................................................................... 5 示例 10(P10.CS): ...................................................................................................................... 6 示例 11(P11.CS):....................................................................................................................... 7 示例 12(P12.CS): ...................................................................................................................... 8 示例 13(P13.CS): ...................................................................................................................... 9 示例 14(P14.CS): .................................................................................................................... 10 示例 15(P15.CS): .................................................................................................................... 10 示例 16(P16.CS): .................................................................................................................... 11 示例 17(P17.CS): .................................................................................................................... 12 示例 18(P18.CS): .................................................................................................................... 13 示例 19(P19.CS): .................................................................................................................... 14 示例 20(P20.CS): .................................................................................................................... 15 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 1 页 第一章 介绍 C#中的接口提供了一种实现运行时的多态。通过接口可以使用相同接口的引用来访问 实现相同接口的不同类的方法,其实是使用虚方法通过相同的引用调用相同基础的不同的 类。在开始前先使用简单的短类例子来解释接口的概念,下面的简短的例子显示接口的特性。 第二章 示例分析 示例 1(P1.cs): class Demo { public static void Main() { System.Console.WriteLine("Hello Interfaces"); } } interface abc { } 输出: Hello Interfaces 编译运行上面的程序运行程序并显示出期望的结果。这段程序包含一个 Demo 类程序入 门 Main()方法中打印“Hello Interfaces”。在上面的程序中还定义了接口 abc。abc 接口是空的,可以在接口中添加一些元素。 示例 2(P2.cs): class Demo { public static void Main() { System.Console.WriteLine("Hello Interfaces"); } } interface abc { int x; } 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 2 页 输出: P2.cs(11,3): error CS0525: Interfaces cannot contain fields 错误!在 C#的接口中不能包含字段例如变量。上面的程序在接口 abc 中声明了一个整 型变量 x。编译将会出错。 示例 3(P3.cs): class Demo { public static void Main() { System.Console.WriteLine("Hello Interfaces"); } } interface abc { void xyz() { System.Console.WriteLine("In xyz"); } } 输出: P3.cs(11,8): error CS0531: 'abc.xyz()': interface members cannot have a definition 这次在接口中定义了 xyz()方法 C#编译器发现了错误。这说明在接口中成员不能有定 义。也就意味着如果在接口 abc 中仅仅只有方法的声明编译器将认为正确? 示例 4(P4.cs): class Demo { public static void Main() { System.Console.WriteLine("Hello Interfaces"); } } interface abc { void xyz(); } 输出: Hello Interfaces 上面的程序编译运行正常产生期望的输出结果。最后编译成功。在 C#的接口中仅仅包 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 3 页 含方法的定义。现在看看方法的作用。 接口是类实现的规范。也就是说接口规定了方法的原型并有类来实现接口所定义的方法 原型。 因此在类 Demo 和接口 abc 结合在一起。 示例 5(P5.cs): class Demo : abc { public static void Main() { System.Console.WriteLine("Hello Interfaces"); } } interface abc { void xyz(); } 输出: P4.cs(1,7): error CS0535: 'Demo' does not implement interface member 'abc.xyz()' P4.cs(11,8): (Location of symbol related to previous error) 在上面的代码中 Demo 和接口 abc 通过“demo : abc”联系在一起,通常对于这个结 合有一点小的误会。类 Demo 需要负责定义接口 abc 中定义的方法原型。因此在上面代码 中的 Demo 没有实现 abc 接口中定义的 xyz 的方法,上面的代码出错。为了修正问题,类 Demo 必须实现接口 abc 中定义的方法原型 xyz。看下面的程序代码。 示例 6(P6.cs): public class Demo : abc { public static void Main() { System.Console.WriteLine("Hello Interfaces"); } void xyz() { System.Console.WriteLine("In xyz"); } } interface abc { void xyz(); } 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 4 页 输出: P6.cs(1,7): error CS0536: 'Demo' does not implement interface member 'abc.xyz()'.'Demo.xyz()' is either static, not public, or has the wrong return type. P6.cs(16,8): (Location of symbol related to previous error) P6.cs(7,8): (Location of symbol related to previous error) 又出现错误!类 Demo 实现了方法 xyz 但没有足够的访问权限。在接口 abc 定义的方 法 xyz 的访问权限是 public。看下面的代码。 示例 7(P7.cs): class Demo : abc { public static void Main() { Demo demo = new Demo(); System.Console.WriteLine("Hello Interfaces"); demo.xyz(); } public void xyz() { System.Console.WriteLine("In xyz"); } } interface abc { void xyz(); } 输出: Hello Interfaces In xyz 好的!上面的代码编译运行成功产生预期的输出结果。正如前面提及的接口可以调用实 现相同的接口的不同的类。因此,需要不同的实现相同接口的类。在上面的代码中类 Demo 实现了接口 abc。下面让另一个类 Sample 也实现接口 abc。 示例 8(P8.cs): class Demo : abc { public static void Main() { System.Console.WriteLine("Hello Interfaces"); Demo refDemo = new Demo(); 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 5 页 refDemo.xyz(); Sample refSample = new Sample(); refSample.xyz(); } public void xyz() { System.Console.WriteLine("In Demo :: xyz"); } } interface abc { void xyz(); } class Sample : abc { public void xyz() { System.Console.WriteLine("In Sample :: xyz"); } } 输出: In Demo :: xyz In Sample :: xyz 上面的程序编译运行成功生产期望的输出结果。refDemo 是类 Demo 的实例。 refSample 是类 Sample 的实例。这两个类都实现了接口 abc 因此他们都实现了方法 xyz()。从程序入口 Main()方法中通过 refDemo 和 refSample 实例分别调用了类 Demo 和类 Sample 的 xyz()方法。 现在有两个不同的类实现了相同的接口此时显示了如何从不同的类中使用相同的接口 引用。 示例 9(P9.cs): class Demo : abc { public static void Main() { System.Console.WriteLine("Hello Interfaces"); abc refabc = null; refabc = new Demo(); refabc.xyz(); refabc = new Sample(); refabc.xyz(); } 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 6 页 public void xyz() { System.Console.WriteLine("In Demo :: xyz"); } } interface abc { void xyz(); } class Sample : abc { public void xyz() { System.Console.WriteLine("In Sample :: xyz"); } } 输出: In Demo :: xyz In Sample :: xyz 上面的代码编译运行程序产生了预期的输出结果。在 Main()方法中定义了接口引用 refabc 是接口 abc 类型。实例化为 Demo 在 refabc 中存储了类 Demo 类定义的 xyz() 可以通过 refabc 来调用。接下去,实例化为 Sample 在 refabc 中存储了类 Sample 类 定义的 xyz()可以通过 refabc 来调用。因此,可以通过共同的接口引用 refabc 来访问 不同的类 Demo 和 Sample 中的 xyz()的方法。 在下面的代码中使用循环调用类 Demo 和 Sample 实现相同接口 abc 使用单一接口引 用 refabc 类型匹配的接口 abc 的类的实现。 示例 10(P10.cs): class Demo : abc { public static void Main() { abc[] refabc = { new Demo(), new Sample() }; for(int i = 0; i <= 1; i++) refabc[i].xyz(); } public void xyz() { System.Console.WriteLine("In Demo :: xyz"); } } interface abc { void xyz(); 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 7 页 } class Sample : abc { public void xyz() { System.Console.WriteLine("In Sample :: xyz"); } } 输出: In Demo :: xyz In Sample :: xyz 上面的代码编译运行程序产生了预期的输出结果。refabc 是一个类型为 abc 接口的 数组。它保存了类 Demo 和 Sample 的对象的引用。在 for 循环中,使用数字 refabc, 可以调用类 Demo 和 Sample 中的方法 xyz()。一个类可以实现多个接口。看下面的程序。 示例 11(P11.cs): class Demo : abc, def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); abc refabc = new Demo(); refabc.xyz(); } public void xyz() { System.Console.WriteLine("In xyz"); } public void pqr() { System.Console.WriteLine("In xyz"); } } interface abc { void xyz(); } interface def { void pqr(); } 输出: 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 8 页 Hello Interfaces In xyz 上面的代码编译运行程序产生了预期的输出结果。类 Demo 实现了接口 abc 并且实现 了 xyz()方法。类 Demo 也实现了 def 接口也实现了 pqr()方法。refabc 是类型为 abc 接口的变量是类 Demo 的实例。可以通过 refabc 的实例调用 Demo 中 xyz()方法就像 refabc 是接口 abc 的类型包含了 xyz()方法的原型 示例 12(P12.cs): class Demo : abc, def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); abc refabc = new Demo(); refabc.xyz(); refabc.pqr(); } public void xyz() { System.Console.WriteLine("In xyz"); } public void pqr() { System.Console.WriteLine("In xyz"); } } interface abc { void xyz(); } interface def { void pqr(); } 输出: P11.cs(9,5): error CS0117: 'abc' does not contain a definition for 'pqr' 错误!尝试通过定义为接口 abc 类型的变量 refabc 的 Demo 实例来访问 pqr()方法, 在接口 abc 中包含了函数 xyz()的原型但没有包含 pqr()方法原型。可以通过类型为接口 def 的 Demo 实例来方法 pqr()方法因为接口 def 包含方法 pqr()的原型。下面的程序代 码将这样实现。 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 9 页 示例 13(P13.cs): class Demo : abc, def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); Demo refDemo = new Demo(); abc refabc = refDemo; refabc.xyz(); def refdef = refDemo; refdef.pqr(); } public void xyz() { System.Console.WriteLine("In xyz"); } public void pqr() { System.Console.WriteLine("In pqr"); } } interface abc { void xyz(); } interface def { void pqr(); } 输出: Hello Interfaces In xyz In pqr 上面的代码编译运行程序产生了预期的输出结果。类 Demo 实现了接口 abc 和 def。 一个类 Demo 的对象创建并将引用存储在 refDemo 中。refabc 是类型为接口 abc 的变量 指向类 Demo 的实例。在 Deom 中的 xyz()方法可以通过 refabc 来方法因为 refabc 是 接口 abc 的变量接口 abc 包含了方法 xyz()的原型。同样,refdef 是类型为 def 的变量 指向类 Demo 的实力。可以通过 refdef 来方法 Demo 中的 pqr()方法,因为 refdef 是 类型为接口 def 的变量,接口 def 中包括了方法 pqr()的原型。 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 10 页 示例 14(P14.cs): class Demo : abc, def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); Demo refDemo = new Demo(); abc refabc = refDemo; refabc.xyz(); def refdef = refDemo; refdef.xyz(); } public void xyz() { System.Console.WriteLine("In xyz"); } } interface abc { void xyz(); } interface def { void xyz(); } 输出: Hello Interfaces In xyz In xyz 上面的代码编译运行程序产生了预期的输出结果。接口 abc 和 def 都定义了方法 xyz() 的原型。类 Demo 实现接口 abc 和 def 并也实现了 xyz()的方法。因此可以通过接口变量 (refabc 或 refdef)存储在 refabc 或 refdef 的 Demo 的对象引用来访问方法 xyz()。 假设一个问题,实现接口 abc 中的 xyz()的方法和实现接口 def 中的 xyz()的方法是不 同的在类 Demo 中如何实现?此时需要按下面的程序使用完全限定名来实现。 示例 15(P15.cs): class Demo : abc, def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); Demo refDemo = new Demo(); abc refabc = refDemo; 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 11 页 refabc.xyz(); def refdef = refDemo; refdef.xyz(); } public void abc.xyz() { System.Console.WriteLine("In abc.xyz"); } public void def.xyz() { System.Console.WriteLine("In def.xyz"); } } interface abc { void xyz(); } interface def { void xyz(); } 输出: P15.cs(13,15): error CS0106: The modifier 'public' is not valid for this item P15.cs(18,15): error CS0106: The modifier 'public' is not valid for this item 失败!使用了全缀名得到错误。原因是当为接口中的部分方法原型使用全缀名是,编译 器不能使用想 public 的修饰符。因此从上面的代码中去掉 public。 示例 16(P16.cs): class Demo : abc, def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); Demo refDemo = new Demo(); abc refabc = refDemo; refabc.xyz(); def refdef = refDemo; refdef.xyz(); } 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 12 页 void abc.xyz() { System.Console.WriteLine("In abc.xyz"); } void def.xyz() { System.Console.WriteLine("In def.xyz"); } } interface abc { void xyz(); } interface def { void xyz(); } 输出: Hello Interfaces In abc.xyz In def.xyz 上面的代码编译运行程序产生了预期的输出结果。系统允许定义接口有相同的方法原型 使使用全缀名。在上面的例子中,接口 abc 和 def 包含相同的方法原型 xyz()。类 Demo 实现了上面两个接口。在实现方法 xyz()可以使用全缀名来制定实现接口 abc 中的方法 xyz()方法还是实现接口 def 中的 xyz()方法。 示例 17(P17.cs): class Demo : def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); Demo refDemo = new Demo(); def refdef = refDemo; refdef.xyz(); refdef.pqr(); } public void xyz() { System.Console.WriteLine("In xyz"); } 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 13 页 public void pqr() { System.Console.WriteLine("In pqr"); } } interface abc { void xyz(); } interface def : abc { void pqr(); } 输出: Hello Interfaces In xyz In pqr 上面的代码编译运行程序产生了预期的输出结果。接口支持继承。接口 def 从接口 abc 中继承了方法原型。类 demo 实先 def 接口。接口变量 refdef 存储了类 Demo 的对象的 引用。可以通过接口变量 refdef 的引用来访问类 Demo 中的 xyz()和 pqr()方法。 接口 def 继承自接口 abc 思考如何使用 xyz()和 pqr()的全缀名。 示例 18(P18.cs): class Demo : def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); Demo refDemo = new Demo(); def refdef = refDemo; refdef.xyz(); refdef.pqr(); } void def.xyz() { System.Console.WriteLine("In xyz"); } void def.pqr() { System.Console.WriteLine("In pqr"); } 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 14 页 } interface abc { void xyz(); } interface def : abc { void pqr(); } 输出: P17.cs(12,8): error CS0539: 'def.xyz' in explicit interface declaration is not a member of interface P17.cs(29,11): (Location of symbol related to previous error) P17.cs(1,7): error CS0535: 'Demo' does not implement interface member 'abc.xyz()' P17.cs(26,8): (Location of symbol related to previous error) 失败!xyz 方法原型是接口 abc 的原始成员。因此,即使接口 def 基础自接口 abc, 但方法 xyz()的全缀名需要是 abc.xyz 而不是上面程序中的 def.xyz。事实上,会获得 编译错误。在下面代码中使用正确的全缀名来修复错误。 示例 19(P19.cs): class Demo : def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); Demo refDemo = new Demo(); def refdef = refDemo; refdef.xyz(); refdef.pqr(); } void abc.xyz() { System.Console.WriteLine("In xyz"); } void def.pqr() { System.Console.WriteLine("In pqr"); } } 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 15 页 interface abc { void xyz(); } interface def : abc { void pqr(); } 输出: Hello Interfaces In xyz In pqr 上面的代码编译运行程序产生了预期的输出结果。但在使用全缀名时有一些小的陷阱。 示例 20(P20.cs): class Demo : def { public static void Main() { System.Console.WriteLine("Hello Interfaces"); Demo refDemo = new Demo(); refDemo.xyz(); refDemo.pqr(); } void abc.xyz() { System.Console.WriteLine("In xyz"); } void def.pqr() { System.Console.WriteLine("In pqr"); } } interface abc { void xyz(); } interface def : abc { void pqr(); 书名:C#接口示例 http://www.dingos.cn http://www.dingos.cn 第 16 页 } 输出: P19.cs(7,5): error CS0117: 'Demo' does not contain a definition for 'xyz' P19.cs(8,5): error CS0117: 'Demo' does not contain a definition for 'pqr' 上面代码是失败的。refDemo 是类 Demo 的对象。可以通过 refDemo 调用 xyz()方 法。因为 C#xyz()和 ddd.xyz()是不相同的事情。abc.xyz()是存在的。xyz()不在类 中。将得到错误信息说类 Demo 没有包含方法 xyz()的定义。因为 C#中 abc.xyz()仅仅 包含在类型 abc 接口的引用。相同的,def.pqr()仅能够通过类型为 def 的应用来调用。
还剩17页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

ihpgf

贡献于2011-04-16

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf