《写给大家看的面向对象编程书》总结&&实践(1)

面向对象概念介绍

过程式程序设计与OO程序设计

OO和过程式程序设计的区别
在OO设计中,属性和行为都包含在一个对象中,而在过程式程序设计中,属性和行为是分开的

适当的设计
可以断言,如果设计得当,OO模型中根本不会有诸如全局数据之类的东西。这一点保证了OO系统中高度的数据完整性。

对象不只是数据结构和基本数据类型,还包含方法。在一个对象中,方法用于完成数据操作和其他动作。更为重要的一点是,可以孔子对象成员(包括属性和方法)的访问。

数据隐藏
在OO术语中,数据表示为属性,行为表示为方法。限制对某些属性或方法的访问称为隐藏。

对象到底是什么

对象数据

存储在一个对象中的数据表示对象的状态,在OO程序设计中,该数据称为属性。

对象行为

对象的行为就是对象能够做什么,也就是在面对过程语言中,行为由过程、函数和子例程定义。在OO程序设计术语中,这些行为包含在方法中,要通过发送消息来调用方法。

获取方法和设置方法(set、get)
获取方法和设置方法的概念支持数据隐藏的概念。因为其他对象不能直接处理另一个对象内部数据,所以获取方法和设置方法提供了对对象数据的一种可控访问。有时也被称为访问方法和修改方法。

UML类图

UML类图
每个类图定义为3个不同部分:类名本身、数据(属性)和行为(方法)

创建一个对象时,称之为对象被实例化。例如这里你创了三个员工,实际上就会创建3个完全不同的Employee类实例。每个对象都包含其自己的属性和方法副本。

类到底是什么

简单的说,类就是对象的一个蓝图。实例化一个对象时,就是使用一个类作为构建这个对象的基础。应该先有类,如果没有类,对象就无法实例化。

属性

访问指示
当某个数据类型或者方法定义我public时,其他对象可以直接访问它。当某个数据类型或方法定义为private时,只有特定对象能够访问。还有一个访问修饰符protected,它允许相关对象访问。

方法

方法实现了一个类所需的行为。从这个类实例化的各个对象都有该类所定义的方法。方法可能实现其他对象(消息)所调用的行为,或者提供这个类内部的基本行为。内部行为是不允许其他对象访问的私有方法。除非是暴露了相应的set、get方法。

消息

消息是对象之家的通信机制。例如当对象A调用对象B的一个方法时,对象A就是在向对象B发送一个消息。当然,只有对象的公共方法能够被另一个对象调用。

封装和数据的隐藏

使用对象的主要优点之一,就是对象不需要公开它的所有属性和行为。在好的OO设计中,对象只应该公开其他对象与之交互所必须的接口。与对象设计无关的细节应当对所有的对象隐藏。

接口

接上文,接口定义了对象间通信的基本途径。每个类设计都要指定接口来正确地实现对象的实例化和操作。在大多数OO语言中,接口中的方法都指定为public

私有数据
要实现数据隐藏,所有属性都应该声明为private。因此属性不是接口的一部分。只有public方法才数据类接口。将属性声明为public会破坏数据隐藏的概念。

一个简单的例子,包含了私有属性、私有方法、公共接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class IntSquare {
//私有属性
private squareValue: number

//公共接口
public getSquare(value: number) {
this.squareValue = this.calculateSquare(value)

return this.squareValue
}

//私有方法
private calculateSquare(value: number) {
return value * value
}
}

let intSquare = new IntSquare()

console.log(intSquare.getSquare(10))

继承

OO程序设计中最强大的一个特性就是代码重用,你可以编写一个过程,然后根据需要使用多次。不过OO设计更近一步,允许通过组织类并抽取各个类的共性来定义类之间的关系,这不仅有利于代码重用,还可以实现更好的整体设计。

父亲类和子类

父类包含继承自该类的所有子类共同的属性和方法。

抽象

继承的强大之处就在于其抽象和组织技术。

在当前的多数OO语言中,一个类只能有一个父类;不过一个父类可以有多个子类。
一个类只能有一个父类叫单重继承(java、.net)、一个类只能有多个父类叫多重继承(如C++)

多态

字面意思是多种形状。问题引申,由于每个子类都是一个单独的实体,他们可能需要对同一个消息做出不同的响应。

多态是指类似对象可以采用不同的方式对相同的消息做出相应。

构造函数

如果一个方法与所在的类同名,而且没有提供任何返回类型,这就是构造函数。可以把构造函数当做类的入口点,这里非常适合完成初始化和准备工作。

小结

本章主要包含以下部分:

  • 封装:将属性和方法封装到一个对象中
  • 继承: 一个类可以从另一个类继承,并且可以利用父类定义的属性和方法
  • 多态:对象可以采用不同的方式对相同的消息做出响应
  • 组合:一个对象由其他对象构建而成

示例代码

定义一个类,直接实例化或者在另一个对象中实例化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Person {
private strName: string
private strAddress: string

get name(): string {
return this.strName
}

set name(name: string) {
this.strName = name
}
}

class TestPerson {
private personq: Person = new Person()

constructor() {
this.personq.name = 'aaa'
console.log(this.personq.name)
}


}

let person = new Person()
person.name = 'jojo'
console.log(person.name) //jojo

let testPerson = new TestPerson() //aaa