我正在编写一个具有“任务”(实际上是假期中的步骤)的应用程序,它具有一些(最小)重叠程度。标准任务或多或少地设计为这样(修剪私人成员):
#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
现在的问题是如何来定义任务,例如由其他类继承的单个类或基类。更清楚:
我最初通过单个类+派生类来处理“从位置”和“到位置案例”,但我不确定它是否太干净。另一方面,我不确定只使用常用方法(name()和description()创建一个基类,也许startDate()和endDate())会很有意义。
鉴于上述用例,最佳做法是什么?
答案 0 :(得分:1)
我不同意组合比继承更好。如果被迫,一个人不能总是使用构图吗?是的,但它可能不是最好的......例如虚函数,基础对象类型的容器。
我更喜欢IS-A和HAS-A测试来确定要做什么。
答案 1 :(得分:0)
如果可能的话,最好使用组合而不是继承。但是如果你为每种类型的任务都有许多相同的项目,你可以很容易地拥有一个基类,然后从中派生出来并为上面提到的其他位置设置一个重载函数,然后派生类可以有自己的方法。它个人操纵这项任务。