如何理解代码中的抽象|设计基础


如何理解代码中的抽象

前置知识

  1. 了解面向对象语言
  2. 理解面向对象三大特性

前言

我们知道,在 Java 中可以使用抽象类或者使用接口来定义抽象方法,继而让继承或者实现它们的类来实现对于的抽象方法。这是抽象在 Java 当中最典型的表现形式。但是抽象作为 面向对象 语言中如此重要的特性,我们应该对其有更加深刻的了解,才能让我们对其使用得更加游刃有余。

下面,我们可以通过问题的形式来加深我们对抽象这一概念的理解。

关于抽象的问题

关于抽象问题,主要回答以下几个问题。

抽象类和接口的区别?

由于抽象类和接口有如下特性

  1. 抽象类三大特性(is-a,继承关系)

    • 抽象类不允许被实例化
    • 抽象类可以包含属性和方法
    • 子类继承抽象类,必须实现所有抽象方法
  2. 接口三大特性(ha-a,协议关系) [jdk8以下]

    • 接口不能包含属性
    • 接口不能包含代码实现
    • 类实现接口,必须实现所有抽象方法

    那么,两者的区别就是

    抽象类可以包含属性和方法,其不能实例化,其功能主要是供子类复用。

    接口不能包含属性和被实现的方法,其功能主要是作为一种协议。

抽象和接口能实现哪些编程问题,有何意义

  1. 抽象类
    • 优雅的解决代码复用问题
    • 优雅的解决多态问题
  2. 接口
    • 解耦,隔离接口和具体的实现
    • 抽象为协议
    • 提高代码的可拓展性

如何模拟接口和抽象类

事实上,在允许继承的普通的代码中。我们定义我们的类满足他们自身的三大特性,即可模拟接口和抽象类了

例如,我们需要模拟接口的时候

我们只需要编写一个正常的类,定义好方法,在方法里面默认实现为抛出异常即可

这样子就满足了接口的三大特性,我们继承该自定义接口类之后,必须要重写对应的方法,否则调用的时候会抛出异常。

使用抽象类或者接口的不同时机

我们需要看待解决的问题

  • 解决代码复用问题。使用抽象类

  • 解决抽象问题,使用接口

为什么基于接口而非实现编程

在软件开发中,最大的挑战之一就是需求的不断变化,这也是考验代码设计好坏的一个标准。

越抽象、越顶层、越脱离具体某一实现的设计,越能提高代码的灵活性,越能应对未来的需求变化。好的代码设计,不仅能应对当下的需求,而且在将来需求发生变化的时候,仍然能够在不破坏原有代码设计的情况下灵活应对。

抽象就是提高代码扩展性、灵活性、可维护性最有效的手段之一

基于接口编程其实就是 基于抽象编程 。对于不稳定(很可能会修改)的系统,我们就要关注可维护性和可拓展性,就要思考其抽象化。

参考

08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口? (geekbang.org)


文章作者: DYJ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 DYJ !
评论
  目录