C++面向对象编程原则及人类示例

================================================================================
标题: C++面向对象编程原则及人类示例
作者: 叶飞虎
日期: 2017.10.12
--------------------------------------------------------------------------------

1. 概述
   在 C++ 面向对象编程中,有很多开发人员无法把控类,以及应该如何编写。在编写类时
有几个原则必须遵循,这样可以使类拥有健壮性及可用性。人类示例 TPerson 描述了类的
生命力,以及类的属性、行为和事件。

   面向对象编程的二个基本特征:封装和继承。
   封装的目的是为了信息隐藏,并保证类数据成员的私有性和一致性,同时数据成员之间
是强耦合,而类与类之间应该弱耦合。

   继承的目的是为了扩充类的多样性,多继承和多态都是继承的扩展方式,而继承会增加
类与类之间的耦合性。


2. 面向对象编程的遵循原则
   a. 类的数据成员尽量放在 private 中,若要开放信息可以通过 public 属性方法操作。
   b. 类属性方法分为: 读取属性和设置属性,读取属性方法名直接用属性名无需添加前缀,
      而设置属性方法前面必须添加前缀 "Set" 并后跟属性名。
   c. 类提供的 public 方法必须具有完备性,如:"Add" 则有 "Delete","Begin" 则有
      "End","Open" 则有 "Close","Start" 则有 "Stop" 等等。
   d. 类的 public 方法必须具有防御能力,保证类成员数据安全,类就像一个封闭的城池,
      public 方法就像城门,为了保证城池安全必须在城门有检查,只有这样才能使城池
      内事物免受破坏。
   e. 类少用继承而多用聚合,通过聚合的方式封装在新的类中,让聚合的成员之间通过行
      为和事件进行关联,并形成成员间的强耦合。若要继承最好使用单类继承,而且单类
      继承也能够解决多类继承问题,即通过聚合新类并继承即可。
   f. 若类内部存在主动向外发起动作时,应该设置事件,并通过事件方式来解决未来问题。
      对象事件就是一个开放的接口,能够绑定相同类型参数和返回值的对象方法,因为无
      需知道方法所属类就可以调用对象方法,具体使用可参见 TPerson 类。


3. 示例代码, 请参见 "Person.cpp"
// =======================================
// Unit   : 面向对象编程的人类示例
// Version: 1.0.0.0 (build 2017.10.12)
// Author : 叶飞虎
// Email  : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* TPerson - 人类 */

class TPerson
{
public:
   // 人的存在状态
   enum TState   {psNothing,           // 虚无
                  psEnding,            // 正在消亡
                  psComing,            // 正在孕育
                  psLiving};           // 活着

   // 性别
   enum TSex     {sexUnknown,          // 未知
                  sexFemale,           // 女性
                  sexMale,             // 男性
                  sexNeuter,           // 中性
                  sexF2Male,           // 女变性男
                  sexM2Female};        // 男变性女

   // 其他类别
   // ??? ... ...

public:
   // OnSound 事件
   typedef void (TObject::*TDoSound)(void* Sender, const TAudio& ASound);
   typedef struct
   {
      TDoSound    Method;
      void*       Object;
   } TOnSound;

   // OnView 事件
   typedef void (TObject::*TDoView)(void* Sender, const TAction& AView);
   typedef struct
   {
      TDoView     Method;
      void*       Object;
   } TOnView;

   // 其他事件
   // ??? ... ...

public:
   TPerson();
   virtual ~TPerson();

   // 属性
   TState         State() const        { return FState; }
   bool           Living() const       { return FState == psLiving; }
   TDateTime      Birthday() const     { return FBirthday; }
   TDateTime      Deathday() const     { return FDeathday; }

   THeadInfo      HeadInfo();                            // 如: 头发、五官信息等等
   TBodyInfo      BodyInfo();                            // 如: 三围信息等等
   TLimbInfo      LimbInfo();                            // 如: 上、下肢信息等等
   // ??? ... ...

   bool           CanProcreate() const                   // 是否能生育只是从性别上判断
                  { return (FSex == sexFemale) || (FSex == sexMale); }
   TSex           Sex() const          { return FSex; }  // 性别
   KYString       Name() const         { return FSocialInfo.Name(); }
   KYString       CertID() c
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值