基于C#的接口基础教程之四

  第四节、访问接口

  对接口成员的访问

  对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义:

 

using System ;
interface ISequence {
 int Count { get; set; }
}
interface IRing {
 void Count(int i) ;
}
interface IRingSequence: ISequence, IRing { }
 class CTest {
  void Test(IRingSequence rs) {
   //rs.Count(1) ; 错误, Count 有二义性
   //rs.Count = 1; 错误, Count 有二义性
   ((ISequence)rs).Count = 1; // 正确
   ((IRing)rs).Count(1) ; // 正确调用IRing.Count
  }
}

  上面的例子中,前两条语句rs .Count(1)和rs .Count = 1会产生二义性,从而导致编译时错误,因此必须显式地给rs 指派父接口类型,这种指派在运行时不会带来额外的开销。

  再看下面的例子:

using System ;
interface IInteger {
 void Add(int i) ;
}
interface IDouble {
 void Add(double d) ;
}
interface INumber: IInteger, IDouble {}
 class CMyTest {
 void Test(INumber Num) {
  // Num.Add(1) ; 错误
  Num.Add(1.0) ; // 正确
  ((IInteger)n).Add(1) ; // 正确
  ((IDouble)n).Add(1) ; // 正确
 }
}

  调用Num.Add(1) 会导致二义性,因为候选的重载方法的参数类型均适用。但是,调用Num.Add(1.0) 是允许的,因为1.0 是浮点数参数类型与方法IInteger.Add()的参数类型不一致,这时只有IDouble.Add 才是适用的。不过只要加入了显式的指派,就决不会产生二义性。

  接口的多重继承的问题也会带来成员访问上的问题。例如:

interface IBase {
 void FWay(int i) ;
}
interface ILeft: IBase {
 new void FWay (int i) ;
}
interface IRight: IBase
{ void G( ) ; }
interface IDerived: ILeft, IRight { }
class CTest {
 void Test(IDerived d) {
  d. FWay (1) ; // 调用ILeft. FWay
  ((IBase)d). FWay (1) ; // 调用IBase. FWay
  ((ILeft)d). FWay (1) ; // 调用ILeft. FWay
  ((IRight)d). FWay (1) ; // 调用IBase. FWay
 }
}

共3页: 上一页 1 [2]
[3]
下一页

时间: 2024-11-17 15:22:57

基于C#的接口基础教程之四的相关文章

基于C#的接口基础教程之六(5)

基础教程 在 .NET 框架程序中通过DllImport使用 Win32 API       .NET 框架程序可以通过静态 DLL 入口点的方式来访问本机代码库.DllImport 属性用于指定包含外部方法的实现的dll 位置.       DllImport 属性定义如下:      namespace System.Runtime.InteropServices   {    [AttributeUsage(AttributeTargets.Method)]    public class

基于C#的接口基础教程之一

第一节 接口慨述 接口(interface)用来定义一种程序的协定.实现接口的类或者结构要与接口的定义严格一致.有了这个协定,就可以抛开编程语言的限制(理论上).接口可以从多个基接口继承,而类或结构可以实现多个接口.接口可以包含方法.属性.事件和索引器.接口本身不提供它所定义的成员的实现.接口只指定实现该接口的类或接口必须提供的成员. 接口好比一种模版,这种模版定义了对象必须实现的方法,其目的就是让这些方法可以作为接口实例被引用.接口不能被实例化.类可以实现多个接口并且通过这些实现的接口被索引.

基于C#的接口基础教程之三

第三节 定义接口成员 接口可以包含一个和多个成员,这些成员可以是方法.属性.索引指示器和事件,但不能是常量.域.操作符.构造函数或析构函数,而且不能包含任何静态成员.接口定义创建新的定义空间,并且接口定义直 接包含的接口成员定义将新成员引入该定义空间. 说明: 1.接口的成员是从基接口继承的成员和由接口本身定义的成员. 2.接口定义可以定义零个或多个成员.接口的成员必须是方法.属性.事件或索引器.接口不能包含常数.字段.运算符.实例构造函数.析构函数或类型,也不能包含任何种类的静态成员. 3.定

基于C#的接口基础教程之五

第五节.实现接口 1.显式实现接口成员 为了实现接口,类可以定义显式接口成员执行体(Explicit interface member implementations).显式接口成员执行体可以是一个方法.一个属性.一个事件或者是一个索引指示器的定义,定义与该成员对应的全权名应保持一致. using System ;interface ICloneable { object Clone( ) ;}interface IComparable { int CompareTo(object other)

基于C#的接口基础教程之六

第六节.接口转换 C#中不仅支持.Net 平台,而且支持COM平台.为了支持 COM和.Net,C# 包含一种称为属性的独特语言特性.一个属性实际上就是一个 C# 类,它通过修饰源代码来提供元信息.属性使 C# 能够支持特定的技术,如 COM 和 .Net,而不会干扰语言规范本身.C# 提供将COM接口转换为 C#接口的属性类.另一些属性类将 COM类转换为C# 类.执行这些转换不需要任何 IDL 或类工厂. 现在部署的任何COM 组件都可以在接口转换中使用.通常情况下,所需的调整是完全自动进行

[转]基于C#的接口基础教程之一

from: http://www.vs2005.com/CSharp-VB.NET/9/1/default.aspx 第一节 接口慨述       接口(interface)用来定义一种程序的协定.实现接口的类或者结构要与接口的定义严格一致.有了这个协定,就可以抛开编程语言的限制(理论上).接口可以从多个基接口继承,而类或结构可以实现多个接口.接口可以包含方法.属性.事件和索引器.接口本身不提供它所定义的成员的实现.接口只指定实现该接口的类或接口必须提供的成员.       接口好比一种模版,这

VBScript基础教程之四VBScript变量

vbscript|变量|基础教程 什么是变量? 变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运行时可更改的程序信息.例如,可以创建一个名为 ClickCount 的变量来存储用户单击 Web 页面上某个对象的次数.使用变量并不需要了解变量在计算机内存中的地址,只要通过变量名引用变量就可以查看或更改变量的值.在 VBScript 中只有一个基本数据类型,即 Variant,因此所有变量的数据类型都是 Variant. 声明变量 声明变量的一种方式是使用 Dim

基于C#的接口基础教程之二

第二节 定义接口 从技术上讲,接口是一组包含了函数型方法的数据结构.通过这组数据结构,客户代码可以调用组件对象的功能. 定义接口的一般形式为: [attributes] [modifiers] interface identifier [:base-list] {interface-body}[;] 说明: 1.attributes(可选):附加的定义性信息. 2.modifiers(可选): 允许使用的修饰符有 new 和四个访问修饰符.分别是:new.public.protected.int

[转]基于C#的接口基础教程之二

from:http://www.vs2005.com/CSharp-VB.NET/10/1/default.aspx 第二节 定义接口 从技术上讲,接口是一组包含了函数型方法的数据结构.通过这组数据结构,客户代码可以调用组件对象的功能. 定义接口的一般形式为: [attributes] [modifiers] interface identifier [:base-list] {interface-body}[;] 说明: 1.attributes(可选):附加的定义性信息. 2.modifie