面向对象的编程思想

Posted by 芦苇 on 2020-06-17

1. 面向对象编程与面向对象语言

  • 面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。
  • 面向对象编程语言是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。

2. 面向对象的四大特性

  • 封装(Encapsulation)
  • 继承(Inheritance)
  • 抽象(Abstraction)
  • 多态(Polymorphism)

2.1 封装(Encapsulation)

What:限制对象的数据与方法的访问。
Why:1. 保护数据不被随意修改;2. 接口有限,提高类的易用性。
How:C++ 和 Java 的 public、protected 和 private 关键字为成员变量和成员函数提供了访问权限控制。

class access control

2.2 继承(Inheritance)

What:表示类之间的 is-a 关系。
Why:1. 代码复用;2. 反应真实世界之间类的关系,在设计上有一种美感。
How:需要语言提供特殊的语法机制。
缺点:继承层级太多,代码的可读性会严重下降。

2.4 抽象(Abstraction)

What:隐藏方法的具体实现。
Why:通过抽象来避免过多关注实现细节,在设计与实现时只需考虑统一抽象层级的逻辑关系。
How:通过语言提供的接口类或抽象类来实现。

抽象这个概念是一个非常通用的设计思想,并不单单用在面向对象编程中,也可以用来指导架构设计等。而且这个特性也并不需要编程语言提供特殊的语法机制来支持,只需要提供“函数”这一非常基础的语法机制,就可以实现抽象特性。所以,它没有很强的“特异性”,有时候并不被看作面向对象编程的特性之一。

2.4 多态(Polymorphism)

What:子类可以替代父类,在代码运行过程中,调用子类的方法。
Why:提高代码的可扩展性和可复用性。
How:需要编程语言提供三个语法机制:

  • 支持继承
  • 支持父类对象可以引用子类对象
  • 支持子类可以重写(override)父类方法

除了“继承+方法重写”这种方式外,还可以用“接口”或者“Duck-Typing” 语法。

接口实现

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
30
31
32
33
34
35
36
37
38
39
public interface Iterator {
String hasNext();
String next();
String remove();
}

public class Array implements Iterator {
private String[] data;

public String hasNext() { ... }
public String next() { ... }
public String remove() { ... }
//...省略其他方法...
}

public class LinkedList implements Iterator {
private LinkedListNode head;

public String hasNext() { ... }
public String next() { ... }
public String remove() { ... }
//...省略其他方法...
}

public class Demo {
private static void print(Iterator iterator) {
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}

public static void main(String[] args) {
Iterator arrayIterator = new Array();
print(arrayIterator);

Iterator linkedListIterator = new LinkedList();
print(linkedListIterator);
}
}

Duck-Typing 语法实现

Duck-Typing
一个对象的语义,不是由继承自特定类型或者实现特定的接口,而是由“当前方法和属性的集合”决定。这个概念的名字来源于由詹姆斯·惠特科姆·莱利提出的鸭子测试,“鸭子测试”可以这样表述:

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Logger:
def record(self):
print(“I write a log into file.”)

class DB:
def record(self):
print(“I insert data into db. ”)

def test(recorder):
recorder.record()

def demo():
logger = Logger()
db = DB()
test(logger)
test(db)

说明:本文是 【 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题? | 王争·设计模式之美 | 极客时间 】 的学习总结