Interfaces

在软件工程中有许多情况,对于不同的程序员群体来说,同意一个阐明其软件交互方式的“Contract”很重要。每个小组都应该能够编写其代码,而无需了解另一小组的代码是如何编写的。一般来说,interface就是这样的契约。

例如,想象一个 Future 的社会,其中计算机控制的机器人汽车无需人工就可将乘客运送穿过城市的街道。汽车制造商编写了用于操作汽车的软件(当然是 Java),包括停止,启动,加速,向左转等等。另一个工业集团,即电子制导仪器制造商,制造了计算机系统来接收 GPS(Global 定位系统)位置数据和交通状况的无线传输,并使用该信息来驾驶汽车。

汽车制造商必须发布行业标准的interface,详细说明可以调用哪些方法来使汽车行驶(任何制造商的任何汽车)。指导制造商然后可以编写软件,该软件调用interface中描述的方法来命令汽车。任何一个工业集团都不需要知道如何实现另一集团的软件。实际上,每个小组都认为其软件是高度专有的,并且保留随时修改它的权利,只要它 continue 遵守已发布的interface。

Java interface

在 Java 编程语言中,interface是类似于类的引用类型,它只能包含常量,方法签名,默认方法,静态方法和嵌套类型。方法主体仅适用于默认方法和静态方法。interface无法实例化-它们只能由类实现或由其他interface扩展。扩展将在本类的后面讨论。

定义interface类似于创建新类:

public interface OperateCar {

   // constant declarations, if any

   // method signatures
   
   // An enum with values RIGHT, LEFT
   int turn(Direction direction,
            double radius,
            double startSpeed,
            double endSpeed);
   int changeLanes(Direction direction,
                   double startSpeed,
                   double endSpeed);
   int signalTurn(Direction direction,
                  boolean signalOn);
   int getRadarFront(double distanceToCar,
                     double speedOfCar);
   int getRadarRear(double distanceToCar,
                    double speedOfCar);
         ......
   // more method signatures
}

请注意,方法签名没有花括号,并且以分号结尾。

要使用interface,请编写实现该interface的类。当实例化类实现interface时,它为interface中声明的每个方法提供一个方法主体。例如,

public class OperateBMW760i implements OperateCar {

    // the OperateCar method signatures, with implementation --
    // for example:
    int signalTurn(Direction direction, boolean signalOn) {
       // code to turn BMW's LEFT turn indicator lights on
       // code to turn BMW's LEFT turn indicator lights off
       // code to turn BMW's RIGHT turn indicator lights on
       // code to turn BMW's RIGHT turn indicator lights off
    }

    // other members, as needed -- for example, helper classes not 
    // visible to clients of the interface
}

在上面的机器人汽车示例中,将由汽车制造商来实现该interface。当然,雪佛兰的实现方式将与丰田的实现方式大不相同,但是两家制造商将遵循相同的interface。作为interface的 Client 端的指导制造商将构建使用汽车位置上的 GPS 数据,数字街道 Map 和交通数据来驾驶汽车的系统。这样,引导系统将调用interface方法:转弯,改变车道,制动,加速等。

interface作为 API

机器人汽车示例显示了一个被用作行业标准应用程序编程interface(API)的interface。 API 在商业软件产品中也很常见。通常,一家公司出售的软件包包含另一家公司要在其自己的软件产品中使用的复杂方法。一个例子是一整套数字图像处理方法,这些方法被出售给制作final用户图形程序的公司。图像处理公司编写其类来实现interface,并向 Client 公开。然后,图形公司使用interface中定义的签名和返回类型来调用图像处理方法。在图像处理公司的 API(向其 Client)公开的同时,其 API 的实现被保留为严密的机密-实际上,只要它 continue 实现原始interface,它就可能在以后修改实现。Client 所依赖的。