《面向对象的思考过程(原书第4版)》一1.8.1 接口

本节书摘来自华章出版社《面向对象的思考过程(原书第4版)》一书中的第1章,第1.8节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问“华章计算机”公众号查看。

1.8.1 接口

我们可以看到接口定义了对象之间通信的基本手段。每个类设计接口规格来保证对象能被正确实例化和操作。必须向对象提供的接口发送消息来使用对象暴露的任何行为。接口需要完整描述类与类之间的交互。在大多数面向对象的语言中,访问修饰符指定为public的方法属于接口。
私有数据
为了实现数据隐藏,必须将所有属性声明为private。属性绝不是接口的一部分。只有Public方法是类接口的一部分。将属性描述为public破坏了数据隐藏这一概念。
我们回过头看一个使用的例子;计算一个数字的平方值。在这个例子中,包括两个接口:
如何实例化一个Square对象。
如何传递给该对象一个值,并获取返回的平方值结果。
正如在本章前面讨论的一样,如果用户需要访问一个属性,我们会创建一个方法(即getter,又称为取值方法)来返回该属性值。然后用户想要获取该属性值,只需调用取值方法即可。在这种方式中,拥有该属性的对象可以控制访问该属性。这种控制非常重要,特别对安全、测试和维护而言。如果你可以控制对属性的访问,当出现了问题,无需追踪所有可能修改了该属性的代码片段,我们只需要修改一个地方(即setter,又称为赋值方法)。
基于安全的原因,你需要防止不受控的代码对诸如密码和个人信息等数据进行修改和获取。
类接口与方法签名
请注意类有接口,方法也有接口。不要混淆这两个接口的概念。类的接口是公共方法。你使用方法的签名来调用这些公共方法。方法的签名主要由方法名和它的参数列表组成。稍后会详细介绍方法签名这一概念。

1.8.2 实现

只有公共属性和方法被认为是接口。用户通过类接口与对象交互时,不应该看到该对象任何内部实现的部分。任何被定义为私有的东西对用户都是不可访问的,这些私有资源属于该类的内部实现。
在之前的例子中,只隐藏了Employee类的实例的属性。很多情况下,也应该隐藏某些方法,不作为接口的一部分。上节的求平方值的例子中,用户不应该关心平方值是如何被计算出来的,只要答案正确即可。我们可以修改实现,但不应该影响用户的代码。例如,提供该计算器的公司可以改变算法(很可能因为该算法更高效)而不会影响结果。

1.8.3 接口/实现范式的一个真实示例

图1-12使用了真实的对象演示了接口/实现范式,这里没有使用代码。烤面包机需要电。为了得到电,烤面包机的插头必须插到电源插座,电源插座就是接口。所有需要获取电力的烤面包机需要实现一个插头,要与电源插座规格适配。这是烤面包机和电力公司(事实上是能源行业)之间的接口。电力设备会关心实际的实现,而烤面包机则无需担心。事实上,对于所有面包机而言,电力实现可能是原子能设备或本地发电机。基于这样的模型,一个装置只要满足接口规格,就可以获取电力,如图1-12所示。

1.8.4 接口/实现范式的模型

我们再拿Square类来举例。假设你正在编写一个计算整数平方值的类。你必须提供接口和实现,也就是说必须定义一种方式使用户能调用并获取平方值,也要实现计算平方值。然而,用户不应该知道任何详细的实现。图1-13展示了一种实现方式。注意在该类图中,加号(+)表示public访问修饰符,而减号(-)表示private访问修饰符。即你可以通过给方法指定加号签名的方式来定义接口。

该类图代码如下:

  
注意该类中用户唯一能访问的元素就是公共方法getSquare。该公共方法就是接口。求平方值算法的实现在私有方法calculateSquare中。请注意属性SquareValue是私有的,因为用户无需知道该属性的存在。因此对象隐藏了一部分实现,只暴露了用户需要与之交互的接口。与使用该对象无关的细节则对其他对象是隐藏的。
如果要修改实现,比如你想使用语言内置的平方值函数,你不需要修改接口。下面代码使用了Java库的方法Math.pow,其提供了同样的功能,但接口依然是calculateSquare:

用户使用相同的接口会得到相同的功能,但具体实现却变了。如果你编写处理数据的代码时可以利用这一点。例如,你可以把数据存储从文件转移到数据库中,而不必强制用户改变任何程序代码。如下

时间: 2024-10-31 01:05:10

《面向对象的思考过程(原书第4版)》一1.8.1 接口的相关文章

《面向对象的思考过程(原书第4版)》一1.1 基本概念

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.1节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著 1.1 基本概念 本书主要目标是让你学会思考如何将面向对象概念应用于面向对象的系统设计中.历史上定义面向对象的语言拥有以下特点:封装(encapsulation).继承(inheritance)和多态(polymorphism).因此,如果设计一门语言时没有完全实现以上特性,那么通常我们认为该语言不是完全面向对象的.即使实现了这三点,我也往往会加入组

《面向对象的思考过程(原书第4版)》一3.5 多重继承

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第3章,第3.5节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 3.5 多重继承 第7章会讲述有关继承的更多细节.然而,这里很适合讨论多重继承.多重继承是类设计中最强大也最具挑战的一个方面. 顾名思义,多重继承允许一个类继承自多个类.实际看起来这是个好主意.对象都应该模拟现实世界,不是吗?现实世界中存在很多多重继承的例子.父母是多重继承的

《面向对象的思考过程(原书第4版)》一 第3章 高级的面向对象概念

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第3章,第3.1节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 第3章 高级的面向对象概念 第1章和第2章讲述了面向对象的基本概念.在开始学习关于构建面向对象系统的一些具体设计问题之前,我们需要更进一步了解面向对象的一些概念,比如构造函数.操作符重载以及多重继承.我们也会讲述错误处理技术以及面向对象的设计中作用域的重要性.其中一些概念可能

《面向对象的思考过程(原书第4版)》一1.3 过程式编程与面向对象编程

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.3节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 1.3 过程式编程与面向对象编程 在我们深入了解面向对象开发的优势之前,先考虑一个更基本的问题:究竟什么是对象?这既是一个复杂的问题,也是一个简单的问题.它复杂是因为学习任何一种软件开发方法论都非易事.它简单是因为人们已经在按对象的方式进行思考.例如,当你看到一个人,你会把他

《面向对象的思考过程(原书第4版)》一1.6 究竟什么是类

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.6节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 1.6 究竟什么是类 简单地说,类是对象的蓝图.当你实例化一个对象时,你基于类来构建这个对象.事实上,尝试解释类和对象实际上是一个先有鸡还是先有蛋的问题.描述类时不使用术语对象是非常困难的,反之亦然.例如,个人自行车是一个对象.然而,有人已经创建了蓝图(就是类)来建造这个自行

《面向对象的思考过程(原书第4版)》一1.10 多态

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.10节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 1.10 多态 多态是一个希腊词,字面上理解为许多形状.尽管多态与继承是紧耦合的关系,但它通常单独作为面向对象技术中最强大的优点之一.当向一个对象发送一个消息时,该对象必须定义一个方法来响应这个消息.在继承体系图中,所有的子类从它们的超类中继承接口.然而,由于每个子类是单独

《面向对象的思考过程(原书第4版)》一第1章 面向对象的概念简介

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,[美] 马特·魏斯费尔德(Matt Weisfeld) 著 第1章 面向对象的概念简介 很多程序员其实并不知道在20世纪60年代就已出现面向对象的软件开发方式.尽管受欢迎的面向对象的编程语言(例如Smalltalk和C++)已被广泛使用,但直到90年代中后期面向对象范式才开始快速发展.面向对象方法论的兴起恰逢互联网作为商业及娱乐平台之际.总之,对象借助网络能良好协作.后来显然互联网存活下来,而面向对象的技术已经在开发新的

《面向对象的思考过程(原书第4版)》一1.9 继承

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.9节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 1.9 继承 面向对象程序设计的最强大的功能之一就是代码重用.结构化设计提供的代码重用非常受限.你可以编写一个功能块,然后多次重用它.但是面向对象的设计更进一步,允许你定义类之间的关系,通过组织和识别不同类之间的共性,不仅可以实现代码重用,也可以指导设计.继承是实现该功能的主

《面向对象的思考过程(原书第4版)》一3.7 结语

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第3章,第3.7节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 3.7 结语 本章涵盖了一些面向对象的高级概念.虽然对于大致理解面向对象,可能没必要学习这些概念,但对于面向对象的更高一级任务(比如设计类)则是非常必要的.在第4章中,我们开始具体来看如何设计和构造类.