Java进阶第六章

抽象

1.一般来说在定义类的时候“ public class 类名{} ”,在public后面多了一个abstract,变为了“ public abstract class 类名{} ”,此时这个类就变为了抽象类;如果在抽象类中有一个public类型的成员函数(或者其他类型),public后面多了abstract,则成为了抽象的成员函数

2.为什么要定义抽象这个概念呢?
答:(1)抽象类是为了表达概念而无法构造出实体的类。 比如在本课程一开始编写的那个绘图程序,我们可以说构造出Square类的实体,一个矩形;但是我们不能说构造出一个Shape类的实体,一个形状;所以Shape类被定义成了抽象类。(2)抽象类中,抽象的成员函数是为了表达概念而无法实现具体代码的函数。 比如绘图程序中Shape下面的抽象成员函数draw(),我们可以draw()一个矩形、圆形,但是没有办法draw出一个形状。需要注意的是,这个抽象成员函数还是得有,否则Shape当作父类进行编写程序的时候可能会用到,也是为了子类的继承再覆盖使用。

3.关于抽象的几个注意点: 抽象的类不能产生对象,但是可以定义一个未初始化的变量,有了这个变量,这个类的非抽象子类就可以用对象/初始化后的子类变量对其进行赋值; 抽象的成员函数不能有“ { } ”,只要类里面有一个抽象的成员函数,那么这个类也必须是抽象的;抽象类要想定义一个非抽象的子类,那么在这个子类中必须对抽象父类里面的所有抽象成员函数进行覆盖(实现),否则就会报错/子类会变成抽像的。

4.计算机的体系术语中,抽象有两种不同的含义:一种是与这里的Shape类相似,与具体相对,表达的是一种概念而非实体。另外一种是与细节相对的,表示在一定程度上忽略细节而着眼大局。

数据与表现分离:细胞自动机

1.**编写程序不仅仅需要掌握语法,还需要掌握一些设计理念。**这个细胞自动机几个类之间的关系如下图所示:CellMashine类负责整体的业务逻辑,Cell类做的就是变换细胞的生死,并且如果是活着的细胞可以把自己画出来,它并不知道Field;Field就是管理数据,可以放置、取出细胞,可以把某细胞的邻居列举出来,它知道Cell,但是不知道View;View做的就是把Field里面所有的细胞全部画出来,它知道Field。Field只负责处理数据,View只负责显示,这两者是分离的。 所以这里体现的设计理念就是 数据处理与表现分离
在这里插入图片描述
在这里插入图片描述
注意:这样的设计可以丰富表现的形式,而不影响到数据的处理,这也是优势之一。

2.在细胞自动机中还体现出来一件重要的事情:责任驱动设计。也就是说要将程序中要实现的功能放到最合适的类/对象中,这是程序设计中非常重要的一环。

3.细胞自动机程序还有一个重要的特性,程序是呈现网格化的,这样的话更好定位,数据也更容易处理了。

4.目前细胞自动机的代码还没有细看和理解,后面需要自己再编写复现一遍,还要完成一下讨论题;

接口:狐狸与兔子

1.这个狐狸与兔子程序是在细胞自动机的程序基础上拓展而来的,Field类依然是负责处理数据;View依然负责表现;因为Fox和Rabbit类有很多共同点,所以做出他们的一个父类Animal;但是这里的Cell到底表达的是什么呢? 按照一般的想法,我们需要把Fox和Animal放进Cell里面,所以需要让Fox和Animal类继承于Cell类,但是多继承在java中是不允许的(几乎所有的op语言都不支持多继承,只有C++可以,并且多继承会带来很多代码编写的麻烦);那么我们让Animal继承自Cell可以吗?这样也是不合理的,会带来语义问题,Animal怎么能事一个Cell呢,此外这个也会增加耦合度,本来Animal家族和右边的Cell、Field、View是没有关系的,Animal可以在家族中做任何想做的事,这样就破坏了独立性;

所以我们的解决方案是把Cell从类改造为接口(一种纯抽象类、特殊的类),不是表达具体的东西了,而是表达某种概念和规范。这样的话所有实现了Cell接口的类的对象/初始化后的变量就可以放到Cell里面去了。

2.关于接口的几个注意点:接口是一种纯抽象类,其不是表达具体的东西了,而是表达某种概念和规范。定义的时候把“ public class 类名{ } ”中的class换为interface,变为“ public interface 接口名{ } ”;注意:格式要与上面讲的抽象类区分。 接口所有的成员函数,不用加以说明(不用加abstract),也全都是抽象的成员函数;所有的成员变量,也都是public static final,表示这个变量属于这个接口,并不属于某个对象,且这个变量是个常量;接口不可以定义对象,但是可以定义未初始化的变量,这样实现了这个接口的类的对象/初始化后的变量就可以给其赋值了;一个类,可以实现多个接口;一个接口,可以从另外一个接口继承而来,但是不能继承自某一个普通类;只有普通类能实现接口,接口不能实现接口。

3.(普通类)实现接口的注意点:在定义类的时候“ public class 类名 (extends 父类名) ”后面要加上“ implements 接口名 ” ;此外在类中必须对接口中的成员函数进行覆盖(实现);

4.**此时我们又引入了一个设计模式:面向接口的编程。**也即当你需要别的一个什么东西为自己提供服务的时候,我们不是去定义一个类出来,而是先定义一个接口出来,比如这里的接口Cell就是友Field和View定义出来的,而不是Animal家族定义出来的。
在这里插入图片描述
5.目前狐狸与兔子程序代码还没有细看和理解,后面需要自己再编写复现一遍,还要完成一下讨论题;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值