接口

Animals can eat

面向接口编程

我们经常会听到“面向接口编程”这个概念,那么问题来了,什么是接口?它和面向对象有什么区别?实际上面向接口是面向对象的一种更加抽象化的表示,本质上还是面向对象的一种。

什么是接口

接口是什么?在C++中它是纯虚类,在Java中是Interface。从形式上来看,接口是一系列仅提供声明的方法组成的集合。而方法的具体实现需要由接口的继承者们实现,一个接口形式可能是如下所示:

1
2
3
4
5
6
class InterfaceName{
public:
virtual ~InterfaceName() {}
virtual void InterfaceMethod1() = 0;
virtual void InterfaceMethod2() = 0;
};

那么问题又来了,我们为何需要接口,接口的本质是什么?我们可以从如下两个方面进行考虑1

接口规定了特定事物所必须包含(或至少可以)的一系列方法

例如我们要去创造一个动物类,那么按照我们的常识,动物们必须(或至少可以)具有如下一些方法:吃饭、睡觉、跑等。那么如果你要创造一个具体的动物,例如猫,那么猫应该具有吃饭、睡觉和跑等功能。所以你创建的猫,应该必须实现这些功能,才能称之为一个合格的动物。(将具体的对象进行了抽象,提取出必备的功能特征)

接口是某一个层次上同一类事物的抽象表示

猫和狗都是动物,那么它们之间的一些方法就可以被提取出来作为共同特征,所以我们可以用一个Animal接口,来保存所有动物都应该具有的特性,在动物这个层次上,猫和狗是同一类事物,它们都可以被抽象为animal。因此在动物这个层次上,我们能够忽略两者之间的差异,将其按照相同或相似的方式进行处理(多态)。

需要注意的是,客观世界是非常复杂的,我们往往只能在相同或相近的层次上对事物进行抽象,但是如果事物之间相差太大,我们很难定义出统一的接口。例如我们能够将猫和狗抽象为动物。但是一只猫和一杆枪,我们可能只能说他们都是物体,这个抽象层次就非常高了。所以在接口定义过程中,我们要先找到相似物体之间的一个层次,在这个层次上对它们进行抽象。

参考文献

0%