面向对象 — 接口深入研究
面向对象 — 接口深入研究
1、接口的定义
什么是接口?接口用来定义一组抽象的操作的集合,通常是一些抽象方法和属性。其实,接口简单的理解就是一样约定、一种软件协议,接口约定和协议继承它的类或者结构(在Web开发方面个人认为类比结构用的多,以下只讨论类Class)必须实现接口中定义的方法,索引器,事件和属性,这就是一种协议,或者叫约定。单就这方面看,接口是没有什么用的,我们不遵守这项协议也能进行开发。但是,由于C#本身只能实现单继承,所以设计者在设计的时候为了实现多继承,就赋予接口一种特殊而有重要的功能,通过接口实现多继承。
2、声明接口
声明接口的如法如下:
public interface ICar
{
string Model
{
get;
set;
}
void StratEngine(Page page);
}
注意:在C#接口中只能包括方法、属性、索引器、事件的声明。不允许声明成员上的修饰符,即使是public也不行,因为接口成员总是公有的,也不能声明为虚拟的和静态的,如果需要修饰符,最好让实现类来声明。
3、接口的实现
接口中定义的方法需要在类中实现,这个过程称为接口的实现。
1. 一个类可以同时实现多个接口(多继承)。后面用“,”分割。若实现类,则类在前,接口在后。继承接口的任何非抽象类型都必须实现接口的所有成员。例如:
public class Car:ICar
{
private string _model;
public string Model
{
get { return _model; }
set { _model = value; }
}
public void StratEngine(Page page)
{
page.Response.Write("Strat Engine!");
}
}
2. 接口和类都可以继承多个接口,类可以继承一个基类,接口更不不能继承类。
3. 一个接口定义了一个只有抽象成员的引用类型。C#中一个接口实际上说做的,仅仅存在着方法的标志(就Web开发普遍应用而言),但是根本就没有执行代码,这就注定了接口不能实例化。也即不能实例化一个接口。只能实例化继承接口的类。
4. 接口可以作为一种引用类型使用。这样方便使用接口中定义的方法,但是执行的是实本接口的类中的方法。同时我们也就可以让它指向执行实现这个接口的任何类型的实例了(通过类型转换实现),比较灵活,但是也有个缺点,就是我们如果不执行接口中的方法,比如类中定义的方法,就要先把接口的引用转换成合适的类型了。
4、显示接口的实现
1.如果类实现了两个接口,并且这两个接口具有相同成员(方法、属性…)那么在类中实现接口的时候,两个接口都使用该成员作为他们的实现,如果功能不一样,这无疑是一种错误,为此,显示接口的实现就是为了解决这种问题的。例如:
Public interface IControl
{
void Paint();
}
Public interface ISurface
{
void Paint();
}
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
2.显式实现还用于解决两个接口分别声明具有相同名称的不同成员(如属性和方法)的情况。
共同的解决办法是在实现接口的时候在相同成员的前面加“接口名称+.”。用于标示实现的是那个接口中的成员。
5、接口中的索引器
索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数,接口索引器的访问器与类索引器的访问器具有以下方面的不同:
1.接口访问器不使用修饰符。
2.接口访问器没有体。
public interface ISomeInterface
{
int this[int index]
{
get;
set;
}
}
class IndexerClass : ISomeInterface
{
private int[] arr = new int[100];
public int this[int index]
{
get
{
if (index < 0 || index >= 100)
{
return 0;
}
else
{
return arr[index];
}
}
set
{
if (!(index < 0 || index >= 100))
{
arr[index] = value;
}
}
}
IndexerClass test = new IndexerClass();//此段为运用
test[2] = 4;
test[5] = 32;
for (int i = 0; i <= 10; i++)
{
System.Console.WriteLine("Element {0} = {1}", i, test[i]);
}
6、接口中的事件
同样,也可以在接口中定义事件,然后在类中实现它。关于它的运用将会在事件和委托中讲到。