hit-20lzh

   :: 首页  :: 新随笔  :: 联系 ::  :: 管理

OOP学习笔记

在ADT(Abstract Type)的核心设计中,根据长期的经验形成了一系列的设计范式,要求在设计之前,思考如下几个问题:

  • 规约:对ADT进行属性和操作的设计
  • 表示独立性:将设计和client完全隔离,client只需利用ADT提供的方法即可实现功能
  • 表示不变量、抽象函数:界定field值的合法与非法值;建立field与现实世界属性/表示的映射
  • 对表示泄露的防范:给出防范表示泄露的方法

field的可见性

    • 指出immutable 的field
    • 对于mutable使用了什么方法防范表示泄露?eg.防御式拷贝

以上对ADT进行概述是为了接下来和OOP的内容进行联系

OOP涵盖的内容,是基于上述ADT理念,阐述如何利用一些新定义的概念(在许多编程语言中有其实现),来通过一系列规范操作完成代码实现

其涉及的概念有:

  • 对象、类、属性、方法
  • 封装与信息隐藏
  • 继承与重写
  • 多态、子类型、重载

对象、类、属性、方法

笔者在阅读时对以上四个概念理解如下:

对象:使用OOP思想coding时,我们首先需要思考的是,如何把一个具有复杂功能的系统,拆分成一个一个的对象,这一个个的对象有着各自的属性和行为,正是一个个对象之间相互配合,才最终构成了具有复杂功能的系统。

类:类是在编程中,对对象的一种抽象,这一抽象很直接,一个对象具有它的属性行为,一个类则具有一系列的fieldmethods(在java的理论中),认为类是基于对象来进行设计有助于理解OOP

 

封装与信息隐藏

 封装:结合ADT设计中的保持表示独立性进行理解,我们希望client不用知道(也不要使用)内部表示,即可完成编程

信息隐藏:结合表示泄露进行理解为了完成封装,我们假设client会尝试某些神奇的操作来破坏对类的封装,我们必须得保证所有类的信息都被隐藏起来(对client不可见)

 

继承与重写(基于代码复用思想)

在OOP编程中,类是一个重要的概念,类除了它本身所具有的field和methods之外,还具有着与其他类之间的重要关系,例如继承

继承:若有两个类,A和B,B是基于A来进行编写的,便认为两者之间具有了继承关系,B继承自A,继承的关系仅停留在理论,在Java的实现中,在类B的定义阶段使用extends字符可以明确指明这一继承关系,同时明确继承对象,java语法则根据这一关系隐式地将类A中的field和method赋予了类B,也因而一个继承关系的出现,也同时产生了父类和子类的概念,B继承A,在这一继承关系中,A是父类而B是子类。

  以上是基于两个类对继承的说明,事实上父类A可以有多个子类B1、B2、B3......(一个父亲生多个儿子,没毛病)

重写:类B继承了类A的field和methods,但有时在子类中,需要的某一个method可能跟父类完全不同,因此可以单独对method进行重写,即只需要按照一定的范式针对需要更改的method进行coding即可。

小思考:继承和重写都是基于一个编程思想而形成的概念——代码复用,在使用继承进行类的设计时,需要牢记在继承关系一形成之后,已经“写好”了一堆代码了,接下来的设计是在已有代码的基础上进行新的实现,因此在编写的时候可以根据需要增加新的field和新的method,或者利用重写这一方式,对原有的method进行更改。

java编程规范:

  • 类之间的继承使用关键字extends
  • 重写要求method的函数签名(函数值、形参列表)和被重写方法一致
  • java中重写还要求,重写后的method的可见性必须≥被重写method;抛出的异常必须满足:1.抛出的异常是其本身或子类 2.在1的基础上抛出异常数量少于原method

 

Interface、Abstract Class、Concrete Class(基于复用性)

在这里,先放下之前对类的理解,它不再是单纯的对某一对象的简单抽象。

Interface:一种用于确定了ADT方法,和各种ADT方法规约的抽象,一经设计便是为了被子类拿去进行实现

  形式上:一个包含一系列未实现的method的类,即一个类,它具有一系列方法,但均无实现(当然在java发展至今,coding时也允许在接口中进行简单的实现,但概念上接口是无实现的)

Abstract Class:一经设计便是为了作为父类,为了泛化出各种各样的子类

  形式上:一个包含了一系列field和一系列method的类(可实现,可未实现),即一个类,它具有的field来表示,还具有一系列方法,这些方法可实现也可不实现

Concrete Class:类设计的最后一步,其实现一般可直接和现实世界的某种东西对应

  形式上:一个包含了一系列field和一系列method的类,其中所有的method都已经实现

Java编程规范:

  • 在设计类时希望继承接口,使用关键字implement
  • 在设计类时希望继承抽象类,使用关键字extends
  • 一旦某一个类extends了某个抽象类或implement了某个接口,则必须在其类里面完成未实现函数的实现
  • 一个类最多只能extends一个抽象类,但可implement多个接口

小思考:

  所有系统功能的最终实现都是基于Concrete Class进行的,所谓的Interface和Abstract Class最终也是为了实现各种各样的类而准备的,但如果撇开Interface和Abstract Class进行设计,Concrete Class这一层次的类实现会非常繁杂。这三个层级的设计思想可归类为基于复用性的设计,Interface、Abstract Class、Concrete Class,从高等级抽象到低等级抽象,而越高等级的抽象一般复用性会更多,而在实现时,一般也会选中不同对象中具有最高共性的方法放入Interface。

  Interface和Abstract Class的使用同时还提醒设计者,完成对之前未实现函数进行实现。

 

多态:

多态为编程提供了不同的方式,同样是基于复用性思想,根据表现方式的不同,多态及其对应技术可分为如下三种:

  • 特殊多态:方法重载
  • 参数化多态:泛型编程
  • 子类型多态:
    • Liskov Substitution Principle(LSP) 里氏替换原则
    • 一个类可有多个子类,B是A的子类同时也意味着每一个类B都满足类A的规约,每一个类B都是类A(这是一种OOP编程的设计思想,编译器无法检测spec,需要实现者自行注意)

小思考:多态概念的提出是为了提高复用性、减少重复操作,在实现过程中会用到方法重载、泛型编程以及里氏替换原则所涉及到的编程规范,这些要求分别对应着不同的多态类型。

eg1.方法重载使得对某一方法的调用根据client输入而变化,而无需因为参数不同就开发两个方法。

posted on 2022-06-07 21:41  Auhevil  阅读(287)  评论(0编辑  收藏  举报