手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C 面向对象程式设计的重要概念

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
类和对象

  对象(Object)是类(Class)的一个实例(Instance)。假如将对象比作房子,那么类就是房子的设计图纸。所以面向对象程式设计的重点是类的设计,而不是对象的设计。类能够将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。类提供关键字public、protected 和private 用于声明哪些数据和函数是公有的、受保护的或是私有的。

  这样能够达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的内容,而隐藏其他一切内容。我们不能够滥用类的封装功能,不要把他当成火锅,什么东西都往里扔。

  类的设计是以数据为中央,还是以行为为中央?

  主张“以数据为中央”的那一派人关注类的内部数据结构,他们习惯上将private 类型的数据写在前面,而将public 类型的函数写在后面,如表8.1(a)所示。

  主张“以行为为中央”的那一派人关注类应该提供什么样的服务和接口,他们习惯上将public 类型的函数写在前面,而将private 类型的数据写在后面,如表8.1(b)所示。




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

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

  继承和组合

  假如A 是基类,B 是A 的派生类,那么B 将继承A 的数据和函数。示例程式如下:

class A
{
 public:
  void Func1(void);
  void Func2(void);
};

class B : public A
{
 public:
  void Func3(void);
  void Func4(void);
};

// Example

main()
{
 B b; // B的一个对象
 b.Func1(); // B 从A 继承了函数Func1
 b.Func2(); // B 从A 继承了函数Func2
 b.Func3();
 b.Func4();
}

  这个简单的示例程式说明了一个事实:C 的“继承”特性能够提高程式的可复用性。正因为“继承”太有用、太容易用,才要防止乱用“继承”。我们要给“继承”立一些使用规则:

  一、假如类A 和类B 毫不相关,不能够为了使B 的功能更多些而让B 继承A 的功能。

  不要觉得“不吃白不吃”,让一个好端端的健壮青年无缘无故地吃人参补身体。

  二、假如类B 有必要使用A 的功能,则要分两种情况考虑:

  (1)若在逻辑上B 是A 的“一种”(a kind of ),则允许B 继承A 的功能。如男人(Man)是人(Human)的一种,男孩(Boy)是男人的一种。那么类Man 能够从类Human 派生,类Boy 能够从类Man 派生。示例程式如下:

class Human
{
 …
};

class Man : public Human
{
 …
};

class Boy : public Man
{
 …
};

  (2)若在逻辑上A 是B 的“一部分”(a part of),则不允许B 继承A 的功能,而是要用A和其他东西组合出B。例如眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head 应该由类Eye、Nose、Mouth、Ear 组合而成,不是派生而成。示例程式如下:

class Eye
{
 public:
  void Look(void);
};

class Nose
{
 public:
  void Smell(void);
};

class Mouth
{
 public:
  void Eat(void);
};

class Ear
{
 public:
  void Listen(void);
};

// 正确的设计,冗长的程式

class Head
{
 public:
  void Look(void) { m_eye.Look(); }
  void Smell(void) { m_nose.Smell(); }
  void Eat(void) { m_mouth.Eat(); }
  void Listen(void) { m_ear.Listen(); }
 private:
  Eye m_eye;
  Nose m_nose;
  Mouth m_mouth;
  Ear m_ear;
};

假如允许Head 从Eye、Nose、Mouth、Ear 派生而成,那么Head 将自动具备Look、Smell、Eat、Listen 这些功能:

// 错误的设计

class Head : public Eye, public Nose, public Mouth, public Ear
{
};


  上述程式十分简短并且运行正确,但是这种设计却是错误的。很多程式员经不起“继承”的诱惑而犯下设计错误。

  一只公鸡使劲地追打一只刚下了蛋的母鸡,您知道为什么吗?

  因为母鸡下了鸭蛋。



[1] [2] 下一页

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS