抽象类

作者: Finlay_Li | 来源:发表于2019-03-30 17:06 被阅读0次

抽象类(abstract class)

  • 什么是抽象类
    被abstract关键字修饰的类

  • 抽象类产生的原因
    随着继承层次中一个个新子类的继承,子类变得越来越具体,而父类则更一般,更通用。
    有时将一个父类设计得非常抽象,以至于它不再 被需要创建出具体的实例

  • 格式
    abstract 修饰
    访问控制修饰符 abstract class 类名{ }

  • 如何使用抽象类

  1. 拥有一个或多个抽象方法的类必须是抽象类
  2. 抽象类中可以有非抽象方法,但是注意2
  3. 抽象类不能创建实例,但可以声明构造器

抽象方法

  • 格式
    访问控制修饰符 abstract 返回值类型 方法名(参数列表);

  • 如何使用抽象方法

  1. 子类继承父类后,若重写了父类中“所有”的抽象方法,该类为具体类,可以创建实例
  2. 子类继承父类后,若没有重写父类中“所有”的抽象方法,该类也必须是抽象类

BB了一大堆,怎么用

  • 某种情况下,父类只能知道子类应该具备一个怎样的方法
    但是不能明确知道子类要如何实现该方法。那么定义“抽象方法”,由子类各自实现

  • 某种情况下,每个子类的一些方法都是确定的,父类则为其实现
    当调用时,实则是由子类实例进行调用(abstract class 没实例)

  • 根据abstract特性,运用于模板方法设计模式(TemplateMethod)
    抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板
    子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类中确定的行为
    是设计中常用的设计模式

如下图设计,在AbstractValidateCodeProcessor中,我们可以实现create 、generate、save、validate的逻辑,而send 由子类实现各自的逻辑

image.png

有些abstarct class一定要子类实现构造函数,怎么做到的

  • 因为
  1. 抽象类不能创建实例,但可以声明构造器
  2. 抽象父类中声明了有参构造器,并无手动声明无参构造器
  • 原理
    继承的特性,在说super关键字有提到
    若父类中没有提供无参构造器,子类“所有”构造器必须显示调用父类的有参构造器

  • 编译错误示例

image.png
  • 为什么这样设计,有啥用呢?

当抽象父类中非抽象方法要使用某些属性,而这些属性的值应该由
子类来给来决定

public abstract class AbstractUserDetails<T> {
    private static final String HEADER = "Authorization";
    private static final String HEADER_FIX = "bearer ";
    private SecurityProperties securityProperties;

    public AbstractUserDetails(SecurityProperties securityProperties) {
        this.securityProperties = securityProperties;
    }

    public T getUser(HttpServletRequest request) {  ....}
}
public class JwtUtils extends AbstractUserDetails<Member> {
    private MemberService memberService;

    public void setAdminService(MemberService memberService) {
        this.memberService = memberService;
    }

    public JwtUtils(SecurityProperties securityProperties) {
        super(securityProperties);
    }

    @Override
    protected Member parserUser(String var) {
        return memberService.queryByPhoneOrEmail(var);
    }
}

相关文章

  • js.pattern -h 模板方法模式

    基于复用技术、抽象类-->继承抽象类 创建抽象类 实现抽象类

  • Dart中的抽象类 多态 以及接口

    抽象类 Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。 1、抽象类...

  • Dart 抽象类 多态 和接口

    抽象类 Dart中的抽象类:Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。抽象类通过a...

  • abstract关键字

    抽象类 PHP5 支持抽象类和抽象方法。抽象类不能被实例化,必须先继承该抽象类,然后实例化该抽象类的子类。抽象类中...

  • 抽象类

    什么是抽象类 抽象类的特征 抽象类的意义

  • 25.面向对象(抽象类. 多态)

    面向对象(抽象类. 多态) 一. 抽象类 抽象类不能实例化 继承抽象类的子类必须将抽象类中所有的抽象方法重写 抽象...

  • Dart 抽象类 多态 接口

    1.抽象类 Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。1、抽象...

  • Flutter/Dart - Dart中的抽象类 多态 和接口

    Dart中的抽象类 Dart中的抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口...

  • Dart中extends和implements

    Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。1、抽象类通过abs...

  • Dart的抽象类和接口

    Dart中抽象类 Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。1、抽象类通过abst...

网友评论

      本文标题:抽象类

      本文链接:https://www.haomeiwen.com/subject/pqhsbqtx.html