本文仅以c++为例,简要说明创建一个类时我们需要考虑的问题。创建一个新类实际上就是定义一 个新的数据类型,因此设计类需要当做类型设计来对待的,c++的设计者在设计语言的内置类型时是经过深思熟虑的,当然我们新设计类时也需要这样来对待,那么我们具体会思考什么样的问题呢?
继承
- 将这个类添加到现有继承层次结构中是否合适?
- 应该使用公有继承还是私有继承?
- 应该支持多继承吗?这样会影响哪些成员函数设置为虚函数。
组合
- 相对于直接使用继承,将一个关联的对象作用数据成员是否更合适?
抽象接口
- 打算将该类设计为抽象基类以使子类重写各个虚成员函数吗?
标准设计模式
- 能否在类的设计中使用众所周知的设计模式?
- 使用设计模式能够从前人深思熟虑的、精妙的设计方法学中获益,也使设计更容易被其他工程师使用。
初始化与析构模型
- 对象的创建于删除是否让客户通过 new 和 delete 实现,还是用工厂方法管理?
- 是否要为知己的类重载 new 和 delete 定制内存分配行为?
- 是否需要使用智能指针?
定义复制构造函数和赋值操作
- 如果这个类中分配了动态内存,那么这两个都是需要定义的(当然,析构函数也需要定义)这会影响对象的复制和安值传递等行为。
模板
- 设计的类是定义了一族类型还是一种类型?如果是一族类型的话,则可以考虑使用模板是设计一般化。
const和explicit
- 尽可能将参数、返回值和方法定义为 const。
- 对于单参数构造函数使用 explicit 关键字以避免意外的类型转换。
操作符
- 定义类需要的操作符,如 +、*=、[]、==或<< 等。
类型转换操作符
- 考虑是否希望设计的类自动转换为其他类型并声明适当的转换操作符。
友元
- 友元会破坏类的封装,友元的出现往往是设计变坏的征兆。不到万不得已不要使用。
非功能性约束
- 如性能和内存使用情况这类的问题也会约束类的设计