设为首页 加入收藏

TOP

1.3 对象的差异(An Object Distinction)(1)
2013-10-07 14:50:26 来源: 作者: 【 】 浏览:62
Tags:1.3 对象 差异 Object Distinction

1.3  对象的差异(An Object Distinction)(1)

C++(www.cppentry.com)程序设计模型直接支持三种programming paradigms(程序设计范式):

译注:paradigm这个字眼常被译为范式。但范式又是什么意思呢?下面是《牛津计算机辞典》中对paradigm这个词条的解释:

A model or example of the environment and methodology in which systems and software are developed and operated. For one operational paradigm there could be several alternative development paradigms. Examples are functional programming, logic programming, semantic data modeling, algebraic computing, numerical computing, object oriented design, prototyping, and natural language dialogue.

一种环境设计和方法论的模型或范例;系统和软件以此模型来开发和运行。一个现役的范式可能会有数个开发中的替代范式。以下是一些大家比较熟悉的范式:函数化程序设计、逻辑程序设计、语意数据模型、几何计算、数值计算、面向对象设计、原型设计、自然语言。

1.程序模型(procedural model)。就像C一样,C++(www.cppentry.com)当然也支持它。字符串的处理就是一个例子,我们可以使用字符数组以及str*函数族群(定义在标准的C函数库中):

  1. char boy[] = "Danny";  
  2. char *p_son;  
  3. ...  
  4. p_son = new char[ strlen( boy ) + 1 ];  
  5. strcpy( p_son, boy );  
  6. ...  
  7. if ( !strcmp( p_son, boy ))  
  8.    take_to_disneyland( boy ); 

2.抽象数据类型模型(abstract data type model,ADT)。此模型所谓的"抽象"是和一组表达式(public接口)一起提供的,那时其运算定义仍然隐而未明。例如下面的String class:
  1. String girl = "Anna";  
  2. String daughter;  
  3. ...  
  4. // String::operator=();  
  5. daughter = girl;  
  6. ...  
  7. // String::operator==();  
  8. if ( girl == daughter )  
  9.    take_to_disneyland( girl ); 

3.面向对象模型(object-oriented model)。在此模型中有一些彼此相关的类型,通过一个抽象的base class(用以提供共同接口)被封装起来。Library_materials class就是一个例子,真正的subtypes例如Book、Video、Compact_Disc、Puppet、Laptop等等都可以从那里派生而来:
  1. void  
  2. check_in( Library_materials *pmat )  
  3. {  
  4.    if ( pmat->late() )  
  5.         pmat->fine();  
  6.    pmat->check_in();  
  7.  
  8.    if ( Lender *plend = pmat->reserved() )  
  9.         pmat->notify( plend );  

纯粹以一种paradigm写程序,有助于整体行为的良好稳固。然而如果混合了不同的paradigms,就可能会带来让人吃惊的后果,特别是在没有谨慎处理的情况下。最常见的疏忽发生在当你以一个base class的具体实例,如:
  1. Library_materials thing1; 

来完成某种多态(polymorphism)局面时:
  1. // class Book : public Library_materials { ... };  
  2. Book book;  
  3.  
  4. // 喔欧,thing1 不是一个 Book!  
  5. // book 被裁切(sliced)了。  
  6. // 不过 thing1 仍保有一个 Library_materials。  
  7. thing1 = book;  
  8.  
  9. // 喔欧,调用的是 Library_materials::check_in()  
  10. thing1.check_in(); 

而不是通过base class的pointer或reference来完成多态局面:
  1. // OK: 现在 thing2 参考到 book  
  2. Library_materials &thing2 = book;  
  3.  
  4. // OK: 现在引发的是 Book::check_in()  
  5. thing2.check_in(); 

虽然你可以直接或间接处理继承体系中的一个base class object,但只有通过pointer或reference的间接处理,才支持OO程序设计所需的多态性质。上个例子中的thing2的定义和运用,是OO paradigm中一个良好的例证。thing1的定义和运用则逸出了OO的习惯;它反映的是一个ADT paradigm的良好行为。thing1的行为是好是坏,视程序员的意图而定。在此范例中,它的行为非常有可能不是你要的!

在OO paradigm之中,程序员需要处理一个未知实例,它的类型虽然有所界定,却有无穷可能。这组类型受限于其继承体系,然而该体系理论上没有深度和广度的限制。原则上,被指定的object的真实类型在每一个特定执行点之前,是无法解析的。在C++(www.cppentry.com)中,只有通过pointers和references的操作才能够完成。相反地,在ADT paradigm中,程序员处理的是一个拥有固定而单一类型的实例,它在编译时期就已经完全定义好了。举个例子,下面这组声明:

  1. // 描述 objects : 不确定类型  
  2. Librar_materials *px = retrieve_some_material();  
  3. Librar_materials &rx = *px;  
  4.  
  5. // 描述已知物 : 不可能有令人惊讶的结果产生  
  6. Librar_materials dx = *px; 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.6.6 商品详细信息查询处理(1) 下一篇1.3 对象的差异(An Object Disti..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: