针对稍微相关的对象的C++类设计
C++ class design for slightly related objects
我正在编写一个应用程序,它的"任务"(实际上是假期中的步骤)具有一定程度(最小)的重叠。标准任务或多或少是这样设计的(修剪私人成员):
#include <QMetaType>
#include <QString>
#include <QDateTime>
#include <QVector>
namespace Marble
{
class GeoDataPlacemark;
}
namespace HolidayPlanner
{
class HolidayTask: public QObject
{
Q_OBJECT
public:
explicit HolidayTask(QString name, ActivityType type=Lodging, QObject* parent=0);
virtual ~HolidayTask();
QString name() const;
QString description() const;
Marble::GeoDataPlacemark *location() const;
virtual ActivityType type() const;
const QDateTime startDate() const;
const QDateTime endDate() const;
void setName(const QString &name);
void setDescription(const QString &description);
void setStartDate(const QDateTime &dateTime);
void setStartDate(int year, int month, int day, int hour, int minutes);
void setEndDate(const QDateTime &dateTime);
void setEndDate(int year, int month, int day, int hour, int minutes);
void setLocation(Marble::GeoDataPlacemark *location);
// private members, etc...
};
} // namespace HolidayPlanner
现在的问题是如何定义任务,例如单个类或其他类继承的基类。更清楚地说:
- 任务通常有名称和描述
- 它们都有开始日期,有些是结束日期
- 有些只有一个位置(例如一个城市),另一些有两个位置(如从和到)
- type()函数返回任务的"类型"(枚举中的标志)
- 根据任务的不同,应用程序需要略微不同地处理数据(即,如果使用单个位置任务,则不要显示"from"answers"to"窗口小部件,等等)
我最初用一个类+一个派生类来处理"从位置"answers"到位置的情况",但我不确定它是否太干净。另一方面,我不确定只使用通用方法(name()和description(),也许startDate()和endDate())创建基类是否有意义。
考虑到上述用例,什么是最佳的操作方案?
我不同意组合比继承更好的观点。如果被迫的话,可以不总是使用作文吗?是的,但这可能不是最好的。。。。例如虚拟函数、基本对象类型的容器。
我更喜欢IS-A和HAS-A测试来确定要做什么。
- 任务通常有一个名称和一个描述-如果这些是派生对象的常量,则在基中是纯虚拟函数(也称为接口)。否则就只是成员
- 所有这些都有开始日期,其中一些是结束日期-开始-->基础,结束-->派生
- 一些有一个位置(例如一个城市),另一些有两个位置(如从和到)-一个位置矢量(三条腿,四条腿?)
- type()函数返回任务的"类型"(枚举中的标志)-使其成为基中的纯虚拟函数(也称为接口)
- 根据任务的不同,应用程序需要稍微不同地处理数据(即,如果使用单个位置任务,则不要显示"from"answers"to"窗口小部件等)-阅读有关模型/视图/控制器(MVC)的信息
如果可能的话,使用组合而不是继承总是更好的。但是,如果每种类型的任务都有许多相同的项,那么你可以很容易地有一个基类,然后从中派生,并为上面提到的其他位置有一个重载函数,然后派生类可以有自己的方法来对该任务进行个人操作。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象