对于面向对象细节的点滴理解——1

来源:互联网 发布:三星手机系统升级软件 编辑:程序博客网 时间:2024/05/01 05:56

《写给大家的面向对象编程书》 Matt Weisfeld 著

摘要、总结


1、 对私有类型的认识(private)

私有类型是用来满足对其他类隐藏本类的信息或实现的,及其不是公共接口,不需要也不能被其他类看见或调用(私有方法不能从实例化对象本身之外调用),其只能在类内部进行调用,来满足它的隐私性。(在做面向对象时,应尽可能多得隐藏数据和实现,对用户提供最小的公共接口。)

如:

private void detail()  {......}


public void function () {//作为公共接口的类内方法调用私有方法

......

detail();

}


2、对构造函数的认识

一般若不写构造函数,系统会提供一个默认构造函数。但自己写一个构造函数并在其中初始化类内属性是一个很好的习惯,可以避免因为没有适当设置属性或对象的初始值而导致的麻烦。 而且构造函数也很重要, 构造函数应该将对象置于一种安全的初始状态下,即其对属性的初始化和内存的管理都应当保证系统的安全。


3、对析构函数的认识

在编写析构函数时, 其要包含必要的清理功能, 这很重要, 比如,释放系统内存等。在C++语言中,其没有自动的垃圾回收机制,从而程序员需要在析构函数中编写代码,来释放对象在其生命周期内的所获得的内存, 否则会面领内存泄露,这会将系统置于不安全的状态。

内存泄露: 若一些对象在出了他们的作用域时并没有释放他们所获取的内存,则这部分内存会被一直占用且对于系统是不可用的,这就会导致系统慢慢的耗尽其可用内存。)


4、对static的理解

一般标记为static的属性或方法在实例化后,其只有一个副本。即,若在全局下声明为static,则该属性就为全局变量,在全局范围内只有一个副本,任何全局的方法或属性都共享这一个副本,对其的访问和修改都对全局有效;若在一个类内声明static,则该属性就为一个类属性,类内的方法或属性共享这一个副本。


5、要善于对程序内部的错误进行处理

即善用 try/catch语句块进行对异常的处理,要尽量的保证一个程序的可执行性(即保证程序在一个稳定的状态),绝对不能使程序崩溃, 尽可能的保证用户的数据不丢失, 是系统妥善推出。

如果没有能够处理所抛出的异常的catch子句,则系统会把异常传递到下一个更高层的try块中,若仍未被捕获,最后则由系统捕获,会导致程序崩溃。

在try中一个语句抛出异常后被一个catch捕获并处理后,系统再从该try块之后的语句开始执行。


6、利用面向对象中 封装 的强大功能

一般从结构化语言转向面向对象语言,在创建类时往往只有方法而没有数据,这样创建的知识结构化模型中得函数,并么有利用 封装 的概念。 要善于用对象的思维来思考问题,将所要用的数据和方法都封装的对象中,这才是面向对象。(封装的基本要求就是尽可能所有的字段都为私有的。)


7、扩展接口  (继承)

当我们所提供的最小的公共接口不能够满足程序的需求时,可以利用 继承 的方法来扩展接口。 即,设计一个新类,让其继承原有的类,再在这个新类中 设计 新的 接口 或 扩展 原有 的接口来满足需求。

对于设计一个类的可扩展性来说,将类设计为只包含特定于该类(对象)所需求的数据和行为就行了。 不要加入超越其本身所能够需要的属性和方法。 如当编写Employee类时, 不希望在其中加入特备针对主管的功能,这样,当有一个不需要主管功能的类继承Employee时就会出现问题。


8、将不可移植的代码抽取出来

若设计一个系统时,其包含不可移植的代码(如,这些代码只能在某个特定的硬件上运行),则应当将这些代码提取出来,放在单独的一个类或方法中。 这样当该系统移植到另一个硬件上时, 只需修改那个单独的类, 而对主类则无需修改。


9、多态

多态指  类似的对象可以对相同的消息做出不同的响应。

如:  对 圆形, 矩形, 星形 对象 都发出相同的 作图消息 , 而各个不同的形状对象 则会响应出 不同的形状。

对于C++ 来说, 利用其虚函数概念来完成多态:

(在继承中, 如果基类和派生类中定义了同名的成员函数, 当用基类指针指向其共有派生类的对象后, 可以使用虚函数来实现通过基类指针找到相应派生类的成员函数(虚函数允许函数调用与函数体之间的联系在运行时才建立, 即 : “ 动态联编”))

纯虚函数为没有具体实现的特殊虚函数, 只为派生类提供一个公共界面)


class shape {

public:

virtual goat area() = 0;  //纯虚函数

}

class triangle:public shape {//三角形继承形状类

public:

float area() { ... 实现三角形面积...}

}

class rectangle:public shape {//矩形继承形状类

public:

float area() { ...  实现矩形面积 ....}

}

int main() {

shape * s;//利用父类的指针指向子类来完成多态

triangle t;

s = &t;

s -> area();// 得到的是三角形的面积

rectangle r ;

s = &r;

s -> area(); // 得到的是矩形的面积

}


10、让作用域尽可能的小

尽可能的将属性和行为置于局部。 对于全局变量来说, 会对全局共享, 容易出错。

如:

public class math {

int temp = 0;

public int swap (int a , int b) { ...  利用temp将a与b的值交换... }

}


temp属性只在swap()方法的作用域中需要,没必要作为一个类变量。 因此, 应将temp属性移到swap() 方法的作用域中。


swap(int a , int b) { int temp = 0;   ...  交换... }

这就保证作用域尽可能的小。


11、 设计时充分考虑可维护性

一定要让类的耦合程度尽可能的低。

当对系统进行修改时, 应只对对象的实现进行修改, 而极力避免对公共接口的修改, 否则, 会导致使用该接口的所有系统都要修改。

0 0
原创粉丝点击