面向对象之抽象与接口

35 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

1. 抽象

如果一个类有了一个抽象的方法,这个类就必须声明为抽象类。如果父类是抽象类,那么子类必须覆盖所有在父类中的抽象方法,否则子类也成为一个抽象类。一个抽象类可以没有任何抽象方法,所有的方法都有方法体,但是整个类是抽象的。设计这样的抽象类主要是为了防止制造它的对象出来。

在第一周就有一个Shape类的例子。这个类有很多的子类,每个子类也都实现了父类的方法。实际上父类Shape只是一个抽象的概念而并没有实际的意义。如果请你画一个圆,你知道该怎么画;如果请你画一个矩形,你也知道该怎么画。但是如果我说:“请画一个形状,句号”。你该怎么画?同样,我们可以定义Circle类和Rectangle类的draw(),但是Shape类的draw()呢?

Shape类表达的是一种概念,一种共同属性的抽象集合,我们并不希望任何Shape类的对象会被创建出来。那么,我们就应该把这个Shape类定义为抽象的。我们用abstract关键字来定义抽象类。抽象类的作用仅仅是表达接口,而不是具体的实现细节。抽象类中可以存在抽象方法。抽象方法也是使用abstract关键字来修饰。抽象的方法是不完全的,它只是一个方法签名而完全没有方法体。

抽象函数|抽象类

  • 抽象函数:表达概念而无法实现具体代码的函数

  • 抽象类:表达概念而无法构造出实体的类

    • 带有abstract修饰符的函数

    • 有抽象函数的类一定是抽象类

    • 抽象类不能制造对象

    • 但是可以定义变量

      • 任何继承了抽象类的非抽象类的对象可以付给这个变量

2.两种抽象

  • 与具体相对:表示一种概念而非实体
  • 与细节相对:表示在一定程度上忽略细节而着眼大局

数据与表现分离(细胞自动机的例子)

  • Field、View、Cell 的关系
  • View只管根据Field画出图形
  • Field只管保存数据
  • 一旦数据更新之后,通知View重新画出整个画面
  • 不去精心设计哪个局部需要更新、简化了程序逻辑、在计算机运算速度提高的基础上实现的

image.png

程序的业务逻辑与表现无关

  • 表现可以是图形的也可以是文本的
  • 表现可以是当地的也可以是远程的

责任驱动的设计

将程序中要实现的功能分配到合适的类、对象中去是设计中非常重要的一环

3.接口(interface)

接口是纯抽象类

所有的成员函数都是抽象函数

所有的成员变量都是public static final

实现接口

  • 类用extends、接口用implements
  • 类可以实现很多接口
  • 接口可以继承接口,但不能继承类
  • 接口不能实现接口

面向接口的编程方式

  • 设计程序时先定义接口,再实现类
  • 任何需要在函数间传入传出的一定是接口而不是具体的类
  • 是Java成功的关键之一,因为极适合多人同时写一个大程序