C ++类设计用于略微相关的对象

时间:2014-03-03 20:36:39

标签: c++ qt oop

我正在编写一个具有“任务”(实际上是假期中的步骤)的应用程序,它具有一些(最小)重叠程度。标准任务或多或少地设计为这样(修剪私人成员):

#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”和“to”小部件等)。

我最初通过单个类+派生类来处理“从位置”和“到位置案例”,但我不确定它是否太干净。另一方面,我不确定只使用常用方法(name()和description()创建一个基类,也许startDate()和endDate())会很有意义。

鉴于上述用例,最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

我不同意组合比继承更好。如果被迫,一个人不能总是使用构图吗?是的,但它可能不是最好的......例如虚函数,基础对象类型的容器。

我更喜欢IS-A和HAS-A测试来确定要做什么。

  • 任务通常具有名称和描述 - 如果这些是派生对象的常量,则基本中的纯虚函数(也称为接口)。否则只是成员。
  • 所有这些都有开始日期,其中一些结束日期 - 开始 - &gt; base,end - &gt; derived
  • 有些人有一个地方(例如一个城市),有些人有两个(例如从和到) - 基地的矢量位置(三条腿,四条?)
  • type()函数返回任务的“类型”(来自枚举的标志) - 使其成为基础中的纯虚函数(也称为接口)
  • 应用程序需要根据任务稍微不同地处理数据(例如,如果您使用单个位置任务,则不显示“from”和“to”小部件等) - 阅读有关模型/视图的信息/ controller(MVC)。

答案 1 :(得分:0)

如果可能的话,最好使用组合而不是继承。但是如果你为每种类型的任务都有许多相同的项目,你可以很容易地拥有一个基类,然后从中派生出来并为上面提到的其他位置设置一个重载函数,然后派生类可以有自己的方法。它个人操纵这项任务。