================================================================================
标题: 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"
标题: 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


238

被折叠的 条评论
为什么被折叠?



