抽象类

作者: 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);
        }
    }
    

    相关文章

      网友评论

          本文标题:抽象类

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