面向对象

什么是面向对象编程

编程的实质是为了解决问题,面向对象这种程序设计方法提供了一种新的思考方式。即以对象为基本单元组织程序结构。对象是类的实例,类中封装了数据和操作。对象是一种更高的抽象概念,现实生活中的万事万物都可以看做是对象,这与人的思维方式更接近,从而更加轻松的对复杂问题进行建模。总结的说面向对象提高了程序的灵活性,扩展性和可维护性。

 

局限

纵然面向对象有如此多的好处,但也绝不是万能的,当做解决的问题的复杂度不高时,面向过程式的编程(将所解决的问题表示成函数序列的顺序集合)会更加高效。面向对象虽然简化了思考方式,但是需要你编写很多的类,打造一个解决问题的模型。这时候就杀鸡不用牛刀了。

 

面向对象的思考方式

一般的思维方式是自顶向下的,把大问题分解成小问题,分而治之。面向对象对象的思维方式是自底向上,先设计底层的程序,再讲他们组合成完整的程序。我是这样理解的,对象或者类组对应着底层的小问题。当我们用面向对象的思维方式去解决问题的时候首先思考们需要哪些对象,构造出这些对象。然后组合这些对象解决最终的问题。实际写代码的时候仅仅使用自底向上上是不够的,因为思维是有局限的,你不可能构想出所有潜在的对象。对我来说更好的方法是辅以自顶向下的思考,用抽象的语言把要解决的最终问题写出来,这种表达的方式会引导你找到更多的类,更多的对象。比如在绘制图形的应用程序中,需要画一个圆形,再涂上颜色。用自底向上使我很轻松想到需要一个Cirl类,类中有DrawAddColor成员函数。自顶向下时我会写出这样的语句 Cirl cirl; cirl.Draw(); cirl.AddColor( yellow ); 这时我想到还需要一个颜色的类,或者关于颜色的枚举。

 

特定语言的面向对象

C++支持面向对象的编程,但是C++不仅仅支持面向对象,它是一个语言联邦。首先它是C的超集,它包含C,其次C++还支持泛型编程,特别地C++包含STL(标准程序库)C++的面向对象没有接口的直接定义,但是可以定义抽象基类实现。接口在Java中是有直接定义的Interface这是一个很酷的概念。继承和多态在C++Java中都有体现。另外一个不同点是Java不支持多重继承而C++支持。

 

面向对象三要素(C++

在了解面向对象基本概念之前,需要明确人的角色。正如文章是写给读者的一样。人在程序设计过程中,分成设计者和使用者是非常非常必要的,因为面向对象的要素是建立在这种分工之上的。

1.封装

也就是数据抽象,又或者是自定义数据类型。将所解决的问题和客观世界的对象进行类比,用基本的数据类型构造出类,实例化此类得到类的对象。一个类自成一个系统,类的接口头提供给类的使用者,类的作者负责实现细节。封装使程序设计变得灵活,简单易用。

2.继承

继承简单说是用已有的类派生新的类,在互联网上有成顿成吨的类库,它们都是精心设计的。站在巨人的肩膀上写代码会写的如鱼得水。如果你不亲自去实现一个继承你不会切实的感受。当我继承OpencvMat从而实现自己的一个图像类时,我只加了几行代码就完成了。那种感觉真是事半功倍。程序员既是类的使用者又是类的设计者,不管是为别人还是为自己,都理应为虚拟的世界添砖加瓦。带着这样的情怀,当我们设计一个类时多想想哪些人可能会用到它,可能会需要它。设计好接口,将奉献的精神星火相传。

3.多态

人说多态是面向对象的精髓,简而言之多态的含义是一个接口多种形态,提高了程序的灵活性和可维护性。在C++中多态需要虚函数,在实现代码中使用基类指针或引用调用虚函数。因为基类指针的静态类型和动态类型不同,在运行时绑定到实际的类型,从而实现多态。多态提高了程序的可维护性。我们为了抢夺市场发布了一个初始的软件版本,之后需要提高性能,需要升级换代。那么在不该变接口的情况下,改变实现代码。不改变用户的使用方式,设计良好时,在用户端甚至不需要重新编译,就能享受更高级的软件版本。造福一方人民真是无量功德。

posted @ 2014-02-26 10:39  tpys  阅读(532)  评论(0编辑  收藏  举报