浅谈面向对象程序设计

2022-10-23

面向对象程序设计 (oop) 是当今主流的程序设计方法。其核心思想是把项目中涉及的各种实体都抽象成被称为类的代码块。为了理解什么是面向对象的程序设计, 我们应该先了解以下几组概念:“类与对象”、“继承与组合”、“虚函数与多态”。理解这些概念, 有助于提高程序的质量, 特别是提高“可复用性”与“可扩充性”。

1面向对象的基本概念

1.1类与对象

对象 (O b j e c t) 是类 (C l a s s) 的一个实例 (Instance) 。如果将对象比作房子, 那么类就是房子的设计图纸。所以面向对象程序设计的重点是类的设计, 而不是对象的设计。类可以将数据和函数封装在一起, 其中函数表示了类的行为 (或称服务) 。类提供关键字public、protected和private用于声明哪些数据和函数是公有的、受保护的或者是私有的。这样可以达到信息隐藏的目的, 即让类仅仅公开必须要让外界知道的内容, 而隐藏其它一切内容。

有的人认为类的设计是以数据为中心, 而有的人认为是以行为为中心。主张“以数据为中心”的那一派人关注类的内部数据结构, 他们习惯上将private类型的数据写在前面, 而将public类型的函数写在后面。主张“以行为为中心”的那一派人关注类应该提供什么样的服务和接口, 他们习惯上将public类型的函数写在前面, 而将private类型的数据写在后面。

很多人主张在设计类时“以数据为中心”, 而我坚持并且建议读者在设计类时“以行为为中心”, 即首先考虑类应该提供什么样的函数。Microsoft公司的COM规范的核心是接口设计, COM的接口就相当于类的公有函数[Rogerson 1999]。在程序设计方面, 我们不要怀疑Microsoft公司的风格。

设计孤立的类是比较容易的, 难的是正确设计基类及其派生类。因为有些程序员搞不清楚“继承” (Inheritance) 、“组合” (Composition) 、“多态” (Polymorphism) 这些概念。

1.2继承与组合

继承 (inheritance) , 是类D的对象可以使用仅对类C的对象有效的方法或者属性的特性, 它使得这些方法和属性就好像是由类D定义的。这时, C是D的父类, D是C的子类。在继承结构中, 父类的内部细节对于子类是可见的。所以我们通常也可以说通过继承的代码复用是一种“白盒式代码复用”。

组合 (composition) , 是通过对现有的对象进行拼装 (组合) 产生新的、更复杂的功能。因为在对象之间, 各自的内部细节是不可见的, 所以我们也说这种方式的代码复用是“黑盒式代码复用”。

继承和组合各有优缺点。比如说, 对于继承, 我们可以在编译期静态地定义其层次结构;因为OOP语言直接支持继承特性, 使得在技术上来说, 继承直白明了易于使用;而且, 我们也可以很容易地修改通过继承所复用的实现代码。但是, 我们不能够在运行期间改变通过继承得到的实现代码;而且更加不好的是, 父类常常会定义一部分子类的表现特征, 使得父类和子类之间的实现代码产生相互依赖, 也就是所谓的“继承破坏封装性” (inheritance breaks encapsulation) 的说法。代码依赖将会导致很多问题, 例如通过继承而来的实现代码可能会不适用于新的问题域, 从而使得我们需要去重写父类或者替换掉某些实现代码。同时, 代码之间的依赖关系, 限制了程序的灵活性和可复用性。

1.3多态

多态性 (Polymorphism) 。多态性实际上是指对于外部对象来说, 对象提供统一的对外接口, 但在内部的实现上可以有不同的实现方式。通过继承, 一个类可以用作多种类型:可以用作它自己的类型、任何基类型, 或者在实现接口时用作任何接口类型。这称为多态性。C#中的每种类型都是多态的。类型可用作它们自己的类型或用作Object实例, 因为任何类型都自动将Object当作基类型。

多态性不仅对派生类很重要, 对基类也很重要。任何情况下, 使用基类实际上都可能是在使用已强制转换为基类类型的派生类对象。基类的设计者可以预测到其基类中可能会在派生类中发生更改的方面。

2面向对象和基于对象的区别

很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点 (封装, 继承, 多态) 缺一不可。通常“基于对象”是使用对象, 但是无法利用现有的对象模板产生新的对象类型, 继而产生新的对象, 也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例, 没有了继承的概念也就无从谈论“多态”。现在很多流行技术都是基于对象的, 它们使用一些封装好的对象, 调用对象的方法, 设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候, 通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念, 但是面向对象实现了“继承和多态”, 而“基于对象”没有实现这些。

从事面向对象编程的人按照分工来说, 可以分为“类库的创建者”和“类库的使用者”。使用类库的人并不都是具备了面向对象思想的人, 通常知道如何继承和派生新对象就可以使用类库了, 然而我们的思维并没有真正的转过来, 使用类库只是在形式上是面向对象, 而实质上只是库函数的一种扩展。

摘要:面向对象程序设计 (OOP) 既吸取了结构化程序设计的一切优点, 又考虑了现实世界与面向对象解空间的映射关系, 它所追求的目标是将现实世界的问题求解尽可能简单化.OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。

关键词:面向对象,类,对象,继承,多态

参考文献

[1] Jonathan C French.Object-oriented programming of HVAC control devices.ASHRAE J.

[2] 汤庸, 结构化与面向对象软件方法, 北京:科学出版社.

本文来自 99学术网(www.99xueshu.com),转载请保留网址和出处

上一篇:嵌入式智能视频监控系统设计初探下一篇:论师生在教学活动中的双主体互动关系