C#中接口(interface)的理解--接口概念的理解

C#中的接口同COM有也相似的地方,比如
1。都是“虚的”---不能被实例化,这也是接口中为什么不能包含字段--成员变量的原因(很简单,成员变量只能属于类的示例,而且C#规定变量在使用前必须初始化,这同接口的“虚”的性质矛盾)。
2。正因为接口是虚的,所以接口内的索引,属性,时间等只能有声明,而不能在接口内实现,具体如何实现是派生接口或者派生类的事。
3。都具有模板的性质,如果一个接口或者类从某一个接口继承,它将自动具有被集成者的特征(包括索引,属性,函数,实践等)。
4。接口支持多重继承,而C#中,类之支持单一继承
下面是接口的一个简单定义:
interface   SampInterface1{
      string this[int index]{get;set};
      event EventHandler Event;
      void  Find(int value);   //注意此处没有{}
      string Point{get;set};

}
上面的接口定义了一个索引this,一个实践Event,一个方法Find和一个属性Point。

=============================================================================

接口的定义如下:
[attributes] [access-modifier] interface interface-name [:base-list] {interface-body}
1.接口的access-modifier可以是任何允许的类型。
2.接口内可以声明方法(mothed)和属性(property)。
3.接口的方法和属性前不能有Access-modifier,如果你写上了,比如public,你将会得到一个编译器错误。
4.接口的方法其实是隐式的(implictly)public,接口就是定义了一个被另外一个类来使用的合同。
5.接口式不能实例化的。但是你可以实例化一个实现这个接口的类。
6.实现接口的类必须准确完整的履行interface定义的合同,也就是说:接口定义了几个方法,你的派生类中就必须提供接口定义的所有方法的实现,属性也是一样,一个也不能少,一点也不能错。
7.不要把接口的方法和抽象函数(abstract)混淆,虽然它们的声明方式很相似,但是实现却不一样,你不能在实现函数前边加上override,如果你这样做了,你将会得到一个编译错误。

8.接口是可以组合的,比如:   public interface IList : ICollection, IEnumerable

9.你不能在同一个层次上继承同一个接口,比如:public interface IList : ICollection,ICollection,当然这样做也没有必要。但是你可以在不同的层次上继承同一个接口,这样做并不会的到编译器错误,但是,最后的接口实现将会覆盖掉上一层的接口实现。

10.你可以显式的实现接口,例如:

using System ;
interface ICloneable {
 object Clone( ) ;
}
interface IComparable {
 int CompareTo(object other) ;
}
class ListEntry: ICloneable, IComparable {
 object ICloneable.Clone( ) {…}
 int IComparable.CompareTo(object other) {…}
}

显式的接口实现主要有两个目的:1、因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员执行体就可以起到作用。2、显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。

猜你喜欢

转载自blog.csdn.net/boiled_water123/article/details/82015547