面向对象核心概念

对象

哲学中的对象

  • 与主体(subject)相对
    • 客体(对象)是可感知到或想象到的任何事物
  • 主体(subject)
    • 对客体有认识和实践能力的人
  • 处于客体的事物,当作为某一具体事物本身的时候就成了主体
    • 其他预知处于关系的物,就成了客体
    • 处于主体的事物,作为其他事物的关系面出现的时候,就成了客体

面向对象中的对象

  • 对象是一个术语
  • 客观世界问题空间的具体事物
  • 表示软件系统解空间的基本元素

在软件系统中,对象具有唯一的标识符。对象包括属性和方法。属性即对象需要记忆的信息,方法即对象能够提供的服务。

对象是某一个类的实例。

面向对象与基于对象

面向对象

允许用户使用面向对象的全部原则

基于对象

  • 允许用户使用一些封装好的对象,调用对象的方法,设置对象的属性。
  • 无法让用户派生新对象类型,
  • 只能使用现有对象的方法和属性

封装与信息隐藏

封装

对象的全部属性 + 全部操作 = 不可分割的独立单位(对象)

封装的优点:

  • 集中而完整地描述病对应一个具体事务
  • 事物具有独立性

封装的缺点:

  • 内部修改对外部的影响
  • 编程麻烦
  • 执行效率损失

信息隐藏

  • 对象与外界交互中,尽可能隐藏对象内部细节
  • 保留有限对外接口与外部进行联系
  • 具体实现细节对外不可见

信息隐藏内容

  • 隐藏属性
  • 隐藏操作
  • 可随与之交互的对象的不同而改变
  • 公开静态的、不变的服务
  • 隐藏动态的、易变的服务

实例化

  • 以类为模板产生属于给类的对象的过程
  • 实例化使并发称为可能
    • 构造函数、析构函数支持实例化机制
      • 保证在程序运行中产生或销毁对象

意义在于实例化符合自然的思维方式,也使得并发处理成为可能。

抽象数据类型(Abstract Data Type,ADT)

  • 遵循封装、信息隐藏与实例化的数据类型

性质

  • 允许程序员自己定义类型从而扩展编程语言
  • 该类型包括数据与操作的定义,二者不可分割
  • 该类型内部,任意操作可以访问该类型的数据或调用该类型的其他操作
  • 该类型外部不能直接访问类型所定义的数据与操作
  • 该类型区分公共接口与私有实现
    • 公共接口向外提供数据与操作的访问
    • 私有事项提供公有接口调用与访问的底层支持数据与操作
  • 可以产生无限实例

类是一个关于一系列共享同样的属性跟行为的对象的描述。

一个对象就是类的一个实例。

扫描二维码关注公众号,回复: 6393178 查看本文章

image


image

属性(attribute)

一个属性是用来定义某个值得取值范围。

一个类也许会有许多属性,也可能完全没有属性。

image

操作

一个操作就是可以被该类任意对象请求的用来触发行为的服务的实现。

一个类也许会有许多操作,也可能完全没有操作。

image

消息传递

  • 只能通过向对方发送消息的方式传递消息来实现对象之间的通信
  • 每个消息必须发送给指定的接受者
    • 消息的解释依赖于接受者
  • 消息传递机制提供
    • 函数名重载
    • 多态
    • 软件复用

消息:

image

泛化与多态

泛化

也称继承,“一般–特殊”结构

泛化关系:类之间的一种关系

  • 将一类对象进一步细分为许多子类
  • 父类称为子类的泛化
  • 子类称为父类的特化

image

多态

具有多种形式或形态的情形

在面向对象方法中表示各子类,名字相同的属性和操作具有不同的意义。

多态的目的在于接口复用节省编码工作量

原型与基调

  • 函数原型:
    • 函数返回类型 + 函数名 + 参数表 = 函数原型
    • 不必包含参数名字,可只包含参数的类型
  • 函数基调(signature,签名,特征标记):
    • 函数名 + 参数类型 + 函数所在类 + 命名空间 + 其他信息
    • 具体的参数签名方法视不同的编译器而定
    • 一般不包括函数的返回类型
  • 函数调用与函数基调(签名)有关

覆盖(override)与重载(overload)

  • 覆盖(overrride)
    • 子类中的成员函数f(x)具有父类成员函数f(x)相同的基调(签名)
    • 子类对父类的f(x)进行了覆盖
    • 覆盖导致多态,由动态链接实现
  • 重载(overload)
    • 允许存在多个同名函数,但这些函数的参数表不同(基调不同)
    • 重载与多态无关,由静态链接实现

动态链接

  • 运行时才知道消息的特定接受者及其相应的方法
    • 编译期间不知连接具体的函数地址
    • 运行时链接相关函数地址
  • 动态链接会影响程序的效率
    • 纯面向对象语言所有函数都以动态链接方式运行

猜你喜欢

转载自blog.csdn.net/hjc256/article/details/90410070