gpt4 book ai didi

稍微相关对象的C++类设计

转载 作者:行者123 更新时间:2023-11-28 07:03:02 25 4
gpt4 key购买 nike

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

#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() 函数返回任务的“类型”(来自枚举的标志)
  • 应用程序需要根据任务处理数据略有不同(即,如果您使用的是单个位置任务,则不要显示“从”和“到”小部件等...)

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

鉴于上述用例,最佳行动方案是什么?

最佳答案

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

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

  • 任务通常有一个名称和一个描述 - 如果这些是派生对象的常量,则在基础中有纯虚函数(也称为接口(interface))。否则只是成员。
  • 所有这些都有开始日期,其中一些有结束日期 - 开始 --> 基准,结束 --> 派生
  • 一些有一个位置(例如一个城市),其他有两个(例如从和到)- base 中的位置 vector (三条腿,四条腿?)
  • type() 函数返回任务的“类型”(来自枚举的标志)- 使其成为基础中的纯虚函数(也称为接口(interface))
  • 应用程序需要根据任务处理数据略有不同(即,如果您使用的是单个位置任务,则不要显示“从”和“到”小部件等...) - 阅读有关模型/ View 的信息/ Controller (MVC)。

关于稍微相关对象的C++类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22156873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com