面向对象的编程-Application 46

Previously on OOP:

List of Course attendees was sorted in ascending order of student number, using 5 approaches .

第三项大作业是:Hydraulic System Simulation,翻译成中文是水力学系统的模拟。除了包含main函数的类之外,其他所有类都在hydraulicpackage中。然后,主的类是HSystem,其他都是辅助的类。

一个水力系统由elements和pipes组成,pipes负责把elements连接在一起。而且,elements还有好几个品种。这说明了什么?说明各种elements可以有一个公共的父类,只是现在是要extends from parent class还是implements interface呢,不知道。

整个水力系统都编写在HSystem类中。这个类中有一个addElement()函数,接收的参数是Element类型的实例,然后把它加入到internal list中。这还说明了:

(1)肯定还有能创建Element类实例的函数。在本项大作业中,这些函数都归main函数管,和HSystem类没有关系。

(2)Element类是所有elements的父类,而且应该是abstract class

HSystem类的getElements()函数能把存放Elements类实例的internal list取出来。Internal list的类型被指定为array,所以选用的数据结构可以是数组,或者是ArrayList。

然后看后半句话:数组的长度可以随着当前存放元素个数的变化而变化,所以本黄鸭觉得internal list的数据结构应该是动态分配的,所以选用ArrayList。

可惜的是,当年布置这项大作业的时候还没有学到Java Generics,所以只能用数组凑合着用了。这样一来,internal list的长度要比getElements()的返回值的长度要长。先要知道internal list中一共有多少个元素,再创建这么长的数组,最后把internal list中的元素一个一个拷贝进去。

这里提到了Element的子类有三种,分别是Source, Tap, and Sink。于是,本黄鸭创建了这三个类,并且让他们都extends Element。

因为所有的element都有一个name attribute,和getName()方法,所以应该被定义在Element类中,这样一来凡是继承Element类的子类就自动拥有了这些members。

connect()函数能把某个element的输入和其他element的输出连在一起。这个需求看起来十分具体,感觉抽象的编程根本办不到,其实只要在Element类中声明一些attributes来存放input / output的实例就可以了。

Sink类是水力系统的终点,没有输出。假如想要把Sink的输出连到其他类的输入去,那么连接不成功,没有任何剧情,只会打印一行error message。这个需求要放在Sink类里面实现。

getOutput()函数的返回值是存放input / output的attributes。

downstream数组最多能存放两个output elements,这个需求在后文中会提到。重点是“new Element[X]”的方括号中的数字是2,而不是1,因为在创建数组的实例时,需要的不是最大的下标,而是最多能存放元素的个数。在创建之后,数组的下标必须要小于方括号中的X。

connect()函数接收的参数是output element的object reference,只要把它存放在downstream数组里面就行了。这个函数必须在Sink类中重载。

Split也是Element类的一个子类,它有两个output elements,所以:

(1)Element.downstream要是一个能存放两个元素的数组。

(2)connect()方法要接收两个参数,第一个是output element的object reference,第二个指明是Split的哪一个output。

(3)getOutput()方法要返回Element.downstream数组。

虽然attributes已经定义在了父类Elements中,但是constructor不能省略不写,至少要写“super(name)”,告诉编译器到父类中去查找name attribute。

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

微信公众号二维码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181214G12G1400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券