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

高级面向对象概念

本章将会介绍更高级的OO概念,如构造函数、操作符重载和多重继承,还将考虑错误处理技术,并强调面向对象设计中应用作用域的重要性。

构造函数

注意
构造函数没有返回值,如果为方法提供一个返回值,编译器就不会把它作为一个构造函数

创建一个新对象时,首先要做的事情之一就是调用构造函数。

new关键字创建一个新实例,并分配所需的内存。然后构造函数被调用,传入参数列表中的参数。构造函数为开发人员提供了一个机会来完成适当的初始化。

初始化属性
在结构化程序设计中,通常需要一个名为housekeeping或initialization的例程来完成初始化工作。

默认构造函数

如果没有为类提供显式的构造函数,就会提供一个默认的构造函数。

这时候,默认构造函数唯一的工作就是调用父类的构造函数。会默认的插入以下默认构造函数:

1
2
3
4
5
6
7
8
9
10
11
class Hero {
constructor() {
}
}


class magic extends Hero {
constructor() {
super()
}
}

一般的经验是,总应该提供一个构造函数,即使你不打算在其中做任何事情。

使用多个构造函数

在TypeScript中没有这部分内容,求证实?

重载方法

重载允许程序员多次使用同一个方法名,只要每次方法的签名不同,签名由方法名和一个参数列表组成。

Java中的重载方法示例:

1
2
3
public void getCab()

public void getCab(int numberOfPassngers)

父类如果构造

使用继承时,必须知道父类如何构造。会完成以下几个步骤:

  • 构造函数中首先做的是调用该类的父类的构造函数,如果没有显示的调用父类的构造函数就会自动调用父类的默认构造函数。在TypeScript中也是如此。
1
2
3
4
5
6
7
8
9
10
11
class Hero {
constructor() {
console.log('我是父类的构造函数')
}
}

class Magic extends Hero {

}

let magic = new Magic() //log: 我是父类的构造函数
  • 然后初始化对象的个各类属性
  • 然后执行构造函数中其余代码

错误处理

抛出异常

一个try/catch块结构:

1
2
3
4
5
try {
//possible nasty code
}catch(Exception e){
//code to handle the exception
}

如果try块中抛出了一个异常,catch块就会处理这个异常。执行try块中时如果抛出一个异常,会发生以下情况:

  • try块的执行会终止
  • 检查catch子句,确定对出现的异常是否班阔一个合适的catch块(每个try块可能不止有一个catch子句)
  • 如果没有能够处理所抛出异常的catch子句,则把异常传递到下一个更高层的try块
  • 如果某个catch子句匹配,则执行该catch子句中的语句
  • 再从try块之后的语句继续执行

作用域的概念

属性作用域、方法作用域

操作符重载

即改变一个操作符的含义。

多重继承

多重继承允许继承多个类。

对象操作

类和引用
复杂数据结构和对象的问题在于,它们包含引用。只建立引用的一个副本并不会复制它引用的数据结构或对象。同样的,比较对象时,如果是将一个指针与另一个指针相比较,这只会比较引用,而不是它们所指的对象

深复制与浅复制
深复制(deep coty)是指,沿着所有引用(指针)完成复制,从而为所引用的所有对象创建新的副本。深复制可能涉及多个层次。一个对象可能包含许多对象的引用,而所引用的这些对象可能又引用更多对象,所以复制本身可能会带来显著的开销。
浅复制(shallow copy)则只是复制引用,而不沿着引用层继续向下。

小结

本章主要分析了构造函数、默认构造函数、错误处理、继承、多重继承以及对象操作(深复制与浅复制)的概念。