1. 面向对象编程与面向对象语言
面向对象编程 是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。
面向对象编程语言 是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。
2. 面向对象的四大特性
封装(Encapsulation)
继承(Inheritance)
抽象(Abstraction)
多态(Polymorphism)
2.1 封装(Encapsulation) What :限制对象的数据与方法的访问。Why :1. 保护数据不被随意修改;2. 接口有限,提高类的易用性。How :C++ 和 Java 的 public、protected 和 private 关键字为成员变量和成员函数提供了访问权限控制。
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)
说明:本文是 【 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题? | 王争·设计模式之美 | 极客时间 】 的学习总结