软件构造3.3(ADT的实现)

ADT的实现

1.两种形式:

  • Interface + class :接口中定义ADT的规约,类中实现ADT。(更普遍)
  • only class :直接使用类作为ADT,既定义ADT也实现ADT。

2.各自的说明和他们之间的关系:

  • 接口:接口中不能有构造函数,因为接口是要暴露给用户的,所以不能暴露实现细节。所以若想直接使用接口来创造对象,即interface的creator,需要使用static factory来返回一个对象。
    错误的实例:interface中不能有constructor
    在这里插入图片描述

  • class implements interface: 类必须重写接口中所有的方法,也可以增加接口中没有的方法。

  • 类与接口的关系:接口之间可以继承与扩展,一个类可以实现多个接口,一个接口可以有多种实现类。

  • 类与类之间的关系:

    • 继承Inheritance: 一个类只能直接extend一个父类。 严格继承即子类中只能添加新方法,不能重写父类的方法,即父类中所有的方法都被关键字final修饰。
    • Overriding: 没有final关键字的父类方法都可以被子类重写,并且重写的方法与父类中有相同的名字、参数和返回值。不同的对象实际执行时调用哪个方法由运行时决定(即创建的实际类型中的方法)。
      如果父类中某函数的实现体为空,则所有子类必须重写这个方法。也可以使用抽象类,即把方法描述为abstract,也可以实现所有子类必须重写这个方法的功能。
      若重写时想用父类的功能,可以使用super关键字,再扩展即可,注意,在子类的构造函数中,必须先使用super创建父类型的对象。
      overridden methods是在run-time进行dynamic checking。
  • 多态

    • Overloading重载(特殊多态):多个方法具有同样的名字,但有不同的参数列表(参数必须不同)或返回值类型。在调用时根据参数列表进行最佳匹配,属于静态多态,在编译阶段决定要具体执行哪个方法,是静态类型检查。不同的对象实际执行时调用哪个方法由在编译时传递的参数的引用决定。
      编译时决定调用哪个函数是看变量的类型,运行时决定调用哪个函数是看变量所指向的实际类型。在这里插入图片描述
    • 参数多态(泛型):一个函数在一系列类型上一致工作,即 types to-be-specified-later。泛型接口,也可以有非泛型的实现类。
      在这里插入图片描述
      注意事项:
      在这里插入图片描述
    • 子类型多态:实现方式为子类型继承父类型,可以提高代码的复用性(子类型的规约不能弱化超类型的规约,满足LSP-Liskov Substitution Principle),使不同类型的对象可以统一的处理,所以能够避免instanceof()函数的使用(一个容易引发运行时类型不匹配错误的函数)。

3.ADT中可能需要重写的方法

Object中:

  • equals(): 如果不重写,就会直接继承object中的直接使用引用判相等的方法。
  • hashCode(): a hash code for use in hash maps.
  • toString(): 一般都需要重写。
  • clone(): 复制并返回一份该对象,其引用并不相等,但其内容相同,同时并不保证其内部所有属性的引用和原来不相等。

4.好的ADT标准

一般都设计为immutable类型,好处是简单、可以直接返回引用、不需要做防御性复制等。要求:

  • 没有mutators
  • 保证其子类中没有重写该类的任何方法
  • 所有的属性都为private and final
  • 避免表示暴露,保证所有可变类型元素的安全
  • 实现toString(), hashCode(), clone(), equals(), etc.
    **如果一定是mutable,则最小化其可变性。**要求:
  • 构造器必须考虑到各种初始化情况
  • 避免重新初始化的方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值