面向对象的编程-Application 12

Previously on OOP:

Operandclass in expr package stores an attribute“value”of type double. AndOperatorclass stores two attributes of type Expression and the operational symbol, for instance,“+”and“*”.

编写一个main函数来检验OperandandOperatorclass的功能。

第一部分是创建Operand类的实例的例子,第二部分是创建Operator类的实例的例子,本黄鸭相信各位宝宝们应该都没有问题。

第三部分也是一个Operator类的实例,但是constructor里面传递的第一个参数是Operator类型的,第二个参数是Operand类型的。这种做法是被允许的,因为OperatorandOperator都是Expression类的子类。在evaluatestar的时候,会做plus.evaluate() *five.evaluate(),乘号前面的部分会先计算出表达式plus的值。这种做法相当于先做“2+3”,再把结果乘以5。

创建一个存放Operand数据类型的数组,名称是values。本黄鸭又要再次强调一遍,数组里面存放的元素类型只能是primitive type or object references。Operand类不属于primitive type,所以values数组里面的元素都是Operand类型的object references。

values数组的初始化能如上段代码所示,写在等号右边的大括号中。需要注意的是,大括号中列举的是数组的元素,所以中间用逗号间隔,而不是表示语句结束的分号。在大括号的后面,声明数组的语句结束,使用分号间隔。

接下来,我们可以使用for each statement遍历values数组,并且打印所有的元素。用红色的一行代码把values数组中的元素排序,再打印一遍排好序的数组。在红色的那行代码中,有几个comments:

(1)sort()函数是Arrays中的一个已经定义好的static function。这里不需要import java.util package,这是因为这里使用了此package的fully qualified name。

(2)实现排序的前提条件是Operand类的实例之间能够比较,有一种已经定义好的比较方式,所以Operand类implements Comparable interface,并且overridden了里面的比较函数。除了Comparable interface,使用Comparator等其他含有比较的类也是完全可以的。

有一个经典的事情是编程的时候应该采用top-down的方式,即自上而下的方式,也就是从最高层的requirements开始思考,然后不断地补充细节的功能。

与之相对的,是bottom-up的思维模式,即自下而上的,也就是从细节开始做起,最后才搭建成一个可以实现user requirements的程序。在编程中,这种思维方式比较少。

在考试中,top-down的思维模式体会在从main facade开始编写,或者是从main函数的功能开始思考。先Start from an example,然后write an exampleandadd relevant class to make the example work。接着就编译,一般都会有编译错误,因为会缺少一些辅助的类和功能,此时click the errors, and Eclipse can automatically create new classes & new constructors。

有一个难点是判断什么时候需要使用common base class,即inheritance。比如,在expr package的例子中,Operand and Operator就有commonparentclass,这是因为我们认为操作数和操作符都是表达式的组成部分。

在后面的例子中,本黄鸭会尽量地推广top-down的思维模式。

欢迎使用本黄鸭编写的小程序~

微信公众号二维码:

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181009G1FS0H00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券