“你好,阿米戈!还是我。我想让换个角度向你介绍接口。你看,大多数情况下,类是一个特定对象的模型。通过比较,接口更像是对象的能力或角色,而不是对象本身。”

接口并不只是接口而已。它还是一种行为。 - 1

例如,汽车、自行车、摩托车和车轮就是类和对象最好的例子。但是它们的能力,例如“我可以移动”,“我可以载人”,以及“我可以停放”则可以理解为接口。请考虑以下示例:

Java 语言代码 说明
interface Moveable
{
void move(String newAddress);
}
相当于移动能力。
interface Driveable
{
void drive(Driver driver);
}
— 相当于移动能力。
interface Transport
{
void addStuff(Object stuff);
Object removeStuff();
}
— 相当于载货能力。
class Wheel implements Moveable
{
...
}
— 车轮 (Wheel) 类。有移动能力。
class Car implements Moveable, Drivable, Transport
{
...
}
— 汽车 (Car) 类。有移动能力,可以由人类驾驶并装载货物。
class Skateboard implements Moveable, Driveable
{
...
}
— 滑板 (Skatebaord) 类。有移动能力,可以由人类控制。
4
任务
Java 核心,  第 4 级课程 1
已锁定
Code entry
Sometimes you don't need to think, you just need to hammer it out! As paradoxical as it may seem, sometimes your fingers will "remember" better than your conscious mind. That's why while training at the secret CodeGym center you will sometimes encounter tasks that require you to enter code. By entering code, you get used to the syntax and assimilate some material. What's more, you combat laziness.

接口可以让程序员的生活轻松许多。程序经常有成千上万的对象,成百上千的类,和多个接口(角色)。角色数量不多,但它们的组合方式(类)可以有很多种。

重点就是你不需要写代码去定义与其他类的交互。你唯一要做的就是定义与角色(接口)的交互。

假如你是一个机器人制造师。你手下有很多机器人,每个机器人都掌握了多项技能。假如你急需要砌墙。你只要召集所有掌握 build(砌墙)技能的机器人,命令它们去砌墙。你不用去关心具体是哪个机器人去砌墙。即使它是个机器喷水壶,只要它会砌墙,就派它去。

下面就是它在代码里的工作原理:

Java 语言代码 说明
static interface WallBuilder
{
void buildWall();
}
— 能够“砌墙 (build a wall)”。理解“砌墙 (build a wall)”命令(有合适的方法)。
static class WorkerRobot implements WallBuilder
{
void buildWall()
 {}
}
static class GuardRobot implements WallBuilder
{
void buildWall()
 {}
}
static class WateringCan
{}
— 有此技能的机器人。

— 浇水壶不能砌墙(它不会实施 WallBuilder 接口)。

public static void main(String[] args)
{
 //add all robots to a list
 ArrayList robots = new ArrayList();
 robots.add(new WorkerRobot());
 robots.add(new GuardRobot());
 robots.add(new WateringCan());

 //build a wall if you can
 for (Object robot: robots)
 {
  if (robot instanceof WallBuilder)
  {
   WallBuilder builder = (WallBuilder) robot;
   builder.buildWall();
   }
  }
 }
}
— 我们如何下达砌墙命令?

“听上去很有趣。我从没想过接口是如此有趣的话题。”

“不止这样!如果再加上多态,效果会更令人震撼。”