接口的实现
案例
interface
IControl
{
void Paint();
}
interface IDataBind
{
void Bing( int d);
}
public class Control:IControl
{
public void Paint()
{;}
}
public class EditBox:Control,IControl,IDataBind
{
public void IControl.Paint()
{;}
public void Bing( int i)
{;}
}
{
void Paint();
}
interface IDataBind
{
void Bing( int d);
}
public class Control:IControl
{
public void Paint()
{;}
}
public class EditBox:Control,IControl,IDataBind
{
public void IControl.Paint()
{;}
public void Bing( int i)
{;}
}
这里类EditBox继承了类Control,接口IControl,IDataBind,在声明成员中,显示的指定了IControl的Paint方法,
显示接口成员只能通过接口调用
改写上面的例子如下
public
class EditBox:IControl,IDataBind
{
void IControl.Paint()
{;}
public void Bing(int i)
{;}
}
class test1
{
static void Main()
{
EditBox editbox = new EditBox();
IControl Control=editbox;
Control.Paint();
}
}
无法使用editbox.Paint(),
是因为EditBox类中并没有包含Paint方法的定义,要访问Paint(),必须把类的变量赋值拥有此方法接口的变量,然后通过Control.Paint()进行调用
值得注意的是,接口本身不提供所定义的成员的实现,它仅仅说明这些成员,这些成员必须依靠实现接口的类或其他接口支持.
显示接口执行体
类似于上面例子的
void
IControl.Paint()
{;}
IControl.Paint
就是显示接口执行体,不能在方法调用,属性访问,以及索引指示器访问中显示的调用接口执行体,事实上,显示接口执行体只能通过接口实例,仅仅引用接口的成员名称来访问
显示接口成员执行体不能使用任何修饰符
,
比如public,abstract,virtual等
显示接口成员执行体和其他成员有着不同的访问方式.因为不能在方法调用,属性访问以及索引指示器访问中通过全名访问,所以显示接口成员执行体在某种程度上是私有的,但它又可以通过接口实例访问,又具备一定的公有性,使用显示接口成员执行体通常只有两个目的
1,
因为显示接口成员执行体不能通过类实例进行访问,这就可以从公有接口中把接口实现部分单独分离出来,如果一个类只在内部使用该接口,而类的使用者不会使用到该接口,这种显示接口执行体就可以起到作用
2,
显示接口执行体避免了接口成员之间因为同名而发生混淆.如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,就必须使用显示接口执行体,如果没有使用它,那么对于名称和返回类型不同的接口成员,类也无法进行实现.
只有类在声明时候,把接口名写在基类列表中,而且类中声明的全权名,类型,返回类型都与显示接口执行体一致时,显示接口成员执行体才有效
interface
IControl
{
void Paint();
}
interface IDataBase
{
void Read();
}
class test:IControl
{
void IControl.Paint();
}
因为类test从接口IControl继承,所以基类列表中包含Paint,所以可以使用显示接口成员执行体,但如果是
Void IDataBase.Read()
则出错,因为并没有继承此接口,而且基类中也没有此接口成员
再例
interface IControl
{
void Paint();
}
class test:IControl
{
void IControl.Paint()
{}
}
class test2:test
{
void IControl.Paint() //
编译报错
{}
}
虽然类test2继承了类test但是接口IControl并没有显示的出现在基类列表中,照样不能使用
再例如
interface IControl
{
void Paint();
}
interface test:IControl
{
void getdata();
}
class test2:test
{
void IControl.Paint()
{}
void test.getdata()
{}
}
这里注意的是,接口继承于接口,与类继承于接口有些不同,因为类继承于接口,必须提供接口的实现方法,而接口继承于接口可以不必,所以同样的例子,test2继承于接口test就可以显示使用隐式继承来的IControl.Paint成员