1. 模型类与控制类
让保存数据的类,仅用于数据的持有,除此之外,不向外界提供过多的修改接口(甚至是访问接口),修改(有时是访问)接口统一交由其控制类。举一个不恰当的例子,试卷类仅用于记录成绩,只有教师类(控制类)可对成绩进行一系列的修改和访问。
让控制类(操纵数据的类),仅用于操作动作(而不保存数据),操纵的方式主要有两种:
维护模型类的对象作为控制类的私有成员变量
将模型类的实例以参数的形式传递给控制类的相关成员函数
这多少已经开始有点 MVC 的设计思想了。
“谁来监督监督者?”,也存在控制类的控制类,使更一层的抽象和提取。但“我附庸的附庸,不是我的附庸”,正如企业的董事长不会事无巨细,直接管理流水线上的每一个员工一样,控制类的控制类也不直接操作数据,而是通过中间的桥梁和媒介,位于中间层的空间类。
所以 MVC 的设计思想,自然内嵌了一种分层的关系。
2. 继承体系
父类和子类(甚至爷类和孙类)之间的不同和差异能有多少?有时不需要很大,只需要重写某一虚函数,甚至唯一的差异在私有成员的持有上,私有成员自然带来构造函数的不同;
子类比父类功能和属性(成员函数和成员变量)上会只多不少,这里的多
,意味着一种功能的拓展,“站在了巨人的肩膀人”。
3. 空参空实现的构造函数的意义
在类的继承层次较深时,如果继承关系中的一层,给出了一种形式的构造(非空参构造)时,编译器就不会为当前类再提供以调用当前类成员函数默认构造为职责的空参构造形式,底层类的构造函数在其初始化参数列表的位置就要显式的给出其父类的实现。
4. 如何在一个类的内部实现规则可选、实现模式可调
所谓规则、所谓模式,都是有限状态集,对有限状态最有力的模拟类型即是枚举类型变量,我们定义这些状态或规则所对应的枚举类型,以一个该枚举类型变量作为该类的构造函数所需的参数(该类内部需维护一个私有的该枚举类型变量),在相关的不同规则、模式下的处理函数时。
class Model
{
public:
enum criterion { normal, case1, case2};
Model(criterion criter):_criter(criter){}
void process()
{
switch (_criter)
{
case normal:
break;
case case1:
break;
case case2:
break;
default:
break;
}
}
private:
const criterion _criter;
};