go里面的接口比较灵活,即接口没有直接归属权,不像java中使用interface直接将接口归属到某个类或者间接实现某一个接口,在go里面没有可以说明这个结构体实现了哪一个接口,它的能力就是对结构体添加成员方法,如果结构体中的方法恰好满足一个接口的所有声明的方法即就可以认为这个结构体实现了该接口,如果满足多个接口的方法就代表它实现了多个接口,但从代码上并没有体现它的实现的接口以及功能,而是从自身的能力上体现了具有的接口功能,符合条件就可被认为实现该接口,它的实例可以被接口的引用接收,这种实现的接口的目的不明确,担是实现的功能目标和是否实现相同接口不同名字取决于当前结构体的任务功能,而不是像java那样被限定实现接口,需要写好几个接口名才实现功能,java的好处就是比较明确该类有的能力,golang不明确有多少个接口的能力,只有使用的时候向符合的接口上转就具备这种能力,c++中没有定义接口二和抽象类的关键字,使用虚函数+虚函数表实现多态,虚函数相当于接口,子类实现接口的所有方法,我们来比较接口和抽象类的概念。
- 接口没有实现任何的方法,只是进行方法的声明,继承接口的类来实现这些方法。
- 接口没有定义任何变量,尽管Java的接口中可以有变量的定义,但是变量也是会被
final
和static
修饰。 - 实现接口的类必须实现接口的所有方法。
- 抽象类可以有变量声明和方法实现/声明。此外,可以继承抽象类而不实现抽象方法。
- 抽象类不能实例化,而是由另一个类继承。实例化和抽象类将导致编译错误。
在了解如何定义抽象类和接口之前,让我们先了解在C++中什么是虚方法和纯虚方法。
虚方法:需要在派生类中进行重新定义,使用virtual
关键字告诉编译器对该方法执行动态链接或后期绑定。
纯虚方法:是一种不需要定义而只需要声明的虚方法,它是通过在方法最后添加=0
进行声明。
C++中的抽象类:
- 最少具有一个纯虚函数。
- 可以有实现的方法。
- 可以进行变量定义。
C++中的接口:
- 所有的函数必须被声明为纯虚函数。
- 没有变量的声明。
什么时候使用接口:
当实现的功能彼此不相关时,创建的每个对象都是独立的,我们使用接口。
什么时候使用抽象类:
当试图创建一个功能的多个版本时,当创建的对象之间存在某种关系时,我们使用抽象类。