首先说下我对接口与类认识:
C#的类只允许单继承机制,而如果我们希望一个子类继承两个或两个以上更多的父类时候,C#语言是不支持的,即C#不允许利用类进行多重继承。在C#语言中,“多重继承”的功能是通过“接口(Interface)”技术;来模拟实现的。
小资料:
C++中允许实现多重继承,C#和java语言都是用接口技术来实现多重继承的。![]()
在C#中需要实现多重继承时,就需要使用接口技术。接口具有类似于抽象类的地位,他只有“被继承”特定,所以接口也像抽象类一样,是一个最高层次的“基类”。但是抽象类只能实现单继承,而接口可实现多继承。因此,在C#中,接口和抽象类既有相同的继承特性(最高层“基类”),又有不同的实现机制。
抽象类指的是至少包含一个抽象方法的类,而抽象方法指的是被继承时,必须被重写的方法。而接口是另一种类似抽象类的引用类型,它主要用来声明要定义的类中将包含那些功能(方法、属性、索引或事件),但不包含这些功能的实例化代码(同抽象类),只在“继承”(通常,在接口技术中称为“实现”,以便与类中的继承有所区别)时才实例化这些功能的代码(也同抽象类)。换句话说,接口只是定义了类必须做什么,而不是怎样去做。
一旦定义了一个接口,许多类都可以实现它。所谓“实现接口”就是意味着某个将要使用这个接口的类,必须为该接口所定义的方法、属性、索引或事件提供实体(实现的代码)。
所以说接口类似于抽象类,但它与抽象类之间又有以下区别:![]()
◎ 接口只提供类所需的方法、属性、索引、事件的格式或约定,不提供任何相应的功能代码。具体的功能代码由继承(使用)该接口的类或结构来实现,这叫作“接口实现”。
◎ 接口中只包含方法、属性、索引、事件,而不包含任何数据成员、构造函数、析构造函数和静态函数,而且接口中的所有成员都被视为公有,不能有任何访问修饰符。
◎ 要实现接口的类必须实现接口中所有成员。即当一个接口或类从其他接口继承时,他将继承它的基接口中的所有成员。而抽象类则可以根据需要重载部分或全部抽象成员。
◎ 接口允许多重继承。一个接口可从多个基接口继承,并包含这些接口继承树上的所有基接口;一个类可以从多个基接口继承;但一个基类最多只能有一个直接父类。
在实际应用中是使用接口还是使用抽象类为组件提供多态性,一般从以下几点考虑:
◎ 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
◎ 如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
◎ 如果要设计小而简练的功能模块,则使用接口。如果要设计大的功能单元,则使用抽象类。
◎ 如果要在组件的所有实现间提供通用的已实现的功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。
接口的定义:![]()
【代码属性】【修饰符】interface 接口名【:基接口列表】
{
。。。。。//接口成员的定义。
}
在接口定义的基接口列表中列出来的接口叫作该接口的显式基接口。接口的基本接口包括它的显式基接口以及显式基接口的接口,依次类推,即接口的基接口包括继承树中的所有接口。换句话说,就是接口从它的基接口中继承所有的成员。例如以下代码中,接口IA分别为ID的两个显式接口IB和IC的显式基接口,所以它也是ID的基接口。
interface IA //定义接口IA
{
void Print();
}
interface IB:IA //定义接口IB 继承基接口 IA 中的所有成员:Print()方法。
{
void Add(int a,int b);
}
interface IC:IA //定义接口IC 继承基接口 IA 中的所有成员:Print()方法。
{
void sub(int a,int b);
}
//接口ID 的基接口为IA、IB和IC,ID接口中包含了3个方法:Print()、Add()和Sub()。
interface ID:IB,IC
{
………………….
}
接口的成员声明:
方法声明:
【代码属性】【new】返回类型 方法名(【参数1、………】);
接口成员的声明默认时具有public特性;接口成员的声明不能包含任何其他的修饰符。而且不能包含方法的实现,所以接口方法的声明总是以分号结束。用户可以使用new 关键字在派生的接口中隐藏接口的同名方法成员,这就类似类中的new 关键字的作用。
interface IA
{
void Math();
}
interface IB:IA //接口IB继承接口IA
{
new void Math();//如果不加new关键字,将会有警告。加上之后便可以消除。
}
属性声明:
【代码属性】【new】属性 属性名{get;set;}
同理,接口中的属性成员不能包含实现,所以只能以分号结束。接口中的属性成员使用new 关键字在派生的接口中隐藏接口的同名属性成员。
interface IDataSeries //可读写的接口属性成员声明
{
void Next
{
get;
set;
}
}
interface IDataSeries //只读的接口属性成员声明
{
void Next
{
get;
}
}
interface IDataSeries //只写的接口属性成员声明
{
void Next
{
set;
}
}
interface IDataMath:IDataSeries //隐藏接口IDataSeries的Next属性成员
{
new void Next
{
set;
}
}
索引声明:
【代码属性】【new】【数据类型】this [int index] {get;set;}
例如:
interface IDataMath
{
int this[int index]
{
get;
set;
}
}
索引器不能使用out和ref关键字
事件声明:
【代码属性】【new】event 事件代理名 事件名
interface IDataMath
{
Event Click MyEvent;
}
以上是我对接口的基础知识的认识
,今天晚上我继续谈谈我对接口其他方面的认识,例如:接口的实现、映射、接口实现多态性等等。请大家多多指教。
浙公网安备 33010602011771号