目录
接口
当接口是interface的译名时,可以指:
- 接口,用于沟通的中介物之抽象化。
C# 语言参考
定义:接口是一种约束形式,其中只包括成员定义,不包含成员实现的内容。
目的:接口的主要目的是为不相关的类提供通用的处理服务,由于C#中只允许树形结构中的单继承,即一个类只能继承一个父类,所以接口是让一个类具有两个以上基类的唯一方式。
接口只包含方法、属性、索引器和事件的签名。方法的实现是在实现接口的类中完成的。接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口的使用可以增加程序的可拓展性。
接口的特点
一个接口也能够拥有方法和属性,但在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体。)
1、接口被用来描述一种抽象
2、JAVA和C#不支持多继承类,接口可以弥补这个局限。
3、接口也被用来解耦(什么是解耦?)
在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使类和构件之间的耦合最小。
分类:有软硬件之间的耦合,还有软件各模块之间的耦合。耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。
解耦,字面意思就是解除耦合关系。在软件工程中,降低耦合度即可以理解为解耦,模块间有依赖关系必然存在耦合,理论上的绝对零耦合是做不到的,但可以通过一些现有的方法将耦合度降至最低。
接口的进一步理解
我们知道,如果某个设备需要向电脑中读取或者写入某些东西,这些设备一般都是采用USB方式与电脑连接的,我们发现,只要带有USB功能的设备就可以插入电脑中使用了,那么我们可以认为USB就是一种功能,这种功能能够做出很多的事情(实现很多的方法),其实USB就可以看做是一种标准,一种接口,只要实现了USB标准的设备我就认为你已经拥有了USB这种功能。(因为你实现了我USB标准中规定的方法)。
关于接口的几个重点:
1、我们不能直接实例化一个接口,因为接口中的方法都是抽象的,是没有方法体的;但是我们可以使用接口类型的引用指向一个实现了该接口的对象,并且调用这个接口的方法。(详细介绍见代码)
为什么有时需要使用接口实例化对象?(只有在某类继承了多个接口时存在区别)
详细见后文代码
Map这个类有IMap、IMapLayers、IActiveView等多个接口,IMap 声明的map只能从Map中得到IMap接口声明的属性和方法,而map1可以得到Map中所有的方法和属性。
2、一个类可以实现不止一个接口。
3、一个接口可以继承于另一个接口,或者另一些接口,接口也可以继承,并且可以多继承。
4、一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法。
5、接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的。
6、接口用来弥补类无法实现多继承的局限。
7、接口也可以用来实现解耦。
using System;
namespace 接口
{
//定义接口
public interface IBark
{
void Bark();
}
public interface IEat
{
void Eat();
}
public class Dog : IBark //继承接口IBark
{
public void Bark()
{
Console.WriteLine("汪汪汪!");//方法实现
}
}
public class Cat : IBark, IEat
{
public void Bark()
{
Console.WriteLine("喵喵喵");
}
public void Eat()
{
Console.WriteLine("I love fish!");
}
}
static class Program
{
static void Main()
{
IBark dog = new Dog();
dog.Bark();
Dog dog1=new Dog();
//dog和dog1没有区别,因为只有一个接口
//Cat存在两个接口
IBark cat= new Cat();
cat.Bark();
cat.Eat(); //报错,IBark cat= new Cat();cat包含的只是Cat()中,IBark接口定义的属性和方法
Cat big_cat = new Cat();//直接Cat big_cat = new Cat(); big_cat包含Cat里的所有方法与属性
big_cat.Eat();
big_cat.Bark();
}
}
}
参考博客