C#界面基础教程四
访问接口成员
对于接口方法的调用,通过指标的访问规则是为那些在同一类。如果基础构件的命名是从遗传水平高的成员一样,底层成员将覆盖同名的前成员。然而,由于接口支持多遗传,如果父母两接口包含多重继承的同名成员,它产生的两种含义。这是原因之一,#取消C类的多重继承机制。在那个时候,需要明确的定义。
Using System;
接口isequence {
int计数{;get;set;}
}
接口应{
空值(int I);
}
接口iringsequence:isequence,iRing { }
类C {
空白试验(iringsequence RS){
/ / rs.count(1);误差、计数有两层含义
/ / rs.count = 1;误差、计数有两层含义
((isequence)RS)。数= 1; / /正确
((物)RS)。计数(1); / /正确调用计数触发。
}
}
在上面的例子中,第一个陈述,RS. Count(1)和RS数= 1,产生两个歧义,导致编译时错误,所以我们必须显式地指定父接口类型的RS,它不在运行时带来的额外成本。
请看下面的例子。
使用系统;
界面整周{
添加空(int I);
}
接口双{
添加空(双D);
}
接口索引编号:IInteger,双{ }
类cmytest {
空白试验(索引编号num){
/ /数加(1)错误;
数增加(1); / /正确
((整周)n),加(1); / /正确
((双)n),加(1); / /正确
}
}
调用数增加(1)使两意义因为候选重载方法的参数类型都是适用的。然而,呼叫数增加(1)是允许的,因为1是浮点数的参数类型和参数类型不一致的方法整周。加(),所以只有双加是。适用。但只要添加显式分配,不会有两个意义。
接口的多重继承问题也会带来成员访问的问题:
接口IBASE {
Void FWay(int i);
}
接口离开:IBase {
新的空隙fway(int i);
}
界面对:IBase
{无效G();}
接口iderived:离开,对{ }
类C {
空白试验(iderived D){
D. FWay(1); / /叫我离开。fway
((IBase)D)。fway(1); / /呼叫IBASE。fway
((我)D)。fway(1); / /叫我离开。fway
((对)D)。fway(1); / /呼叫IBASE。fway
}
}
在本例中,该方法是在我离开ibase.fway导出接口的fway离开覆盖方法的成员。所以叫d. FWay(1)实际上叫。虽然从继承路径IBASE -> -> iderived对的方法,ileft.fway不是盖的。我们必须记住这一次的成员都包括在内,所有的成员已覆盖拦截。
类到接口的实现
正如我们之前所说的,接口定义不包括方法的实现部分,接口可以通过类或结构实现。我们主要描述的接口实现类。当一个接口是一个类实现的接口的名称,必须包括在基类列表中类的定义。
下面的例子给出了由class.isequence接口实现的一个例子是一个队列接口。它提供了将对象添加到队列末端的成员方法。添加(),IRing是一个圆形的表界面。它提供了一种方法来插入对象插入到环(对象)。该方法返回插入的位置,ringsquence类实现的接口和界面的isequence物。
使用系统;
接口isequence {
对象添加();
}
接口isequence {
对象添加();
}
接口应{
插入(对象);
}
类ringsequence:isequence,IRing
{
公共对象添加(){…}
公开插入(对象){…}
}
如果一个类实现了一个接口,那么类将隐式地继承接口的所有父接口,而不管这些父接口是否在类定义的基类表中列出:
使用系统;
Interface IControl {
虚空漆();
}
接口itextbox:IControl {
无效的setText(文本);
}
接口ilistbox:IControl {
无效setItems(字符串{ }项目);
}
接口icombobox:itextbox,ilistbox { }
在这里,icombobox itextbox接口继承和ilistbox。文本框类不仅实现了界面itextbox,而且实现了接口的itextbox父接口控制。
正如我们前面看到的,一个类可以实现多个接口。
接口idatabound {
空绑定(宾德b);
}
公共类的编辑框:控制,IControl,idatabound {
公共空白漆();
公共空绑定(宾德b){…}
}
类的编辑框是从该类派生的控制和实施控制和idatabound。在前面的例子中,涂料的方法在界面控制和在idatabound接口绑定的方法是在类的普通成员编辑框实现。C #提供了另一种实现这些方法,这些类可以实现避免设置这些成员以公开的方式,接口成员可以有效的名称来实现。例如,编辑框可以转换为控制。油漆和idatabound绑定来实现。
公共类的编辑框:IControl,idatabound {
无效的iControl。漆(){…}
idatabound绑定无效。(宾德B){…}
}
因为每个成员是通过外部分配的接口成员的成员实施实施,这种方式称为外部接口成员。外部接口成员只能通过接口调用。例如,在涂料的方法编辑框的实现只能由创建的iControl接口调用。
类测试{
静态空主(){
编辑框编辑框=新的编辑框();
编辑框。漆(编辑框); / /错误:没有油漆的事件
控制控制=编辑框;
(控制。漆); / /呼叫editbox Paint事件
}
}
在这个例子中,编辑框类继承的控件类实现了接口和控制idatabound。在编辑框油漆方法来自iControl接口和绑定的方法来自idatabound接口,和两者在编辑框类的公有成员实施。当然,在C #,我们也可以选择不实现接口作为一个公共成员。
如果每个成员清楚地指出已实现的接口,通过这种方式实现的接口称为显式接口成员:
公共类的编辑框:IControl,idatabound {
无效的iControl。漆(){…}
idatabound绑定无效。(宾德B){…}
}
只能通过接口调用显式接口成员:
类C {
静态空主(){
编辑框编辑框=新的编辑框();
(编辑框。漆); / /错误:不同的方法
控制控制=编辑框;
控制。油漆(涂料); / /叫EditBox法
}
}
打电话给编辑框。漆()在上面的代码是错误的,因为编辑框本身并不提供这method.control.paint()是调用正确的方法。
注意:接口本身不提供定义成员的实现,它只指示这些成员。这些成员必须依赖接口或其他接口。
知道如何访问接口,我们也知道如何实现接口来实现C #接口,见下一节-实现接口