接口的定义:
接口是指定一组函数成员,而不实现他们的引用类型。
接口使用interface 关键字进行定义,可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。接口的特点:
1、接口类似于抽象基类,不能直接实例化接口;接口中的方法都是抽象方法,实现接口的任何非抽象类型都必须实现接口的所有成员:
2、当显式实现该接口的成员时,实现的成员不能通过类实例访问,只能通过接口实例访问。
3、当隐式实现该接口的成员时,实现的成员可以通过类实例访问,也可以通过接口实例访问,但是实现的成员必须是公有的。
4、接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型、不能包含静态成员。
5、接口成员是自动公开的,且不能包含任何访问修饰符。
6、接口自身可从多个接口继承,类和结构可继承多个接口,但接口不能继承类。
7、当一个类既继承基类,又继承接口的时候,必须基类写在前面,基类和接口用逗号隔开,一个类只能有一个基类,可以继承许多接口
/// <summary>
/// 定义一个爬树接口
/// </summary>
interface IClimbTree
{
void ClimbTree();
}
/// <summary>
/// 定义一个抓老鼠接口
/// </summary>
interface ICatchMice
{
void CatchMice();
}
/// <summary>
/// 定义一个宠物类
/// </summary>
public class Pet
{
public void Eat()
{
Console.WriteLine("吃着真香");
}
}
/// <summary>
/// 狗狗类,继承于宠物类,又实现了爬树和抓老鼠接口
/// </summary>
public class Cat:Pet,IClimbTree,ICatchMice
{
public void ClimbTree()
{
Console.WriteLine("我会爬树");
}
public void CatchMice()
{
Console.WriteLine("我会抓老鼠");
}
}
class Program
{
static void Main(string[] args)
{
//实例化一个猫咪对象
Cat cat = new Cat();
cat.Eat();
cat.ClimbTree();
cat.CatchMice();
Console.ReadLine();
}
}
输出结果:
- 显示实现接口
public void IClimbTree.ClimbTree()
{
Console.WriteLine("我会爬树");
}
public void ICatchMice.CatchMice()
{
Console.WriteLine("我会抓老鼠");
}
- 隐式实现接口
public void ClimbTree()
{
Console.WriteLine("我会爬树");
}
public void CatchMice()
{
Console.WriteLine("我会抓老鼠");
}
一般情况,当类或者结构要实现的是单个接口,可以使用隐式实现。
如果类或者结构继承了多个接口且接口中具有相同名称成员时,就要用到显式实现,当显式实现方式存在时,隐式实现方式就失效了。接口和抽象类的区别
1、接口用于规范,抽象类用于共性。
2、接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。
3、抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。
4、抽象类可以提供某些方法的部分实现,接口不可以。
5、抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。
6、在抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写。
7、接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。
8、接口不能包含字段、构造函数、析构函数、静态成员或常量。