我基本上必须制作一个能够生成PDF的程序。 PDF将有3种不同的页面类型:封面纸,普通纸和最后封面纸。标题包含大量信息,但封面页和一般页的标题仅相差1个项目,但是,一个项目要求我在坐标中向下移动其他项目。我附上一张照片来说明我的意思。
此类实际服务的唯一目的是保持值以表示将用作目标的矩形,以便在pdf中打印文本。因此,除了构造函数之外,它们实际上不需要任何功能,只需从常量文件中初始化值。
我正在尝试使用“好”的设计实践,但我不确定什么是更有效的方法。我似乎不能使用共享共同元素的继承,因为我总是会在其中一个类中找到我不需要的东西。我想过只使用合成并为标题中的每个元素创建一个类,这样可以解决问题,但是我会有更多的类,它只是一个只保留一个看起来不像的数据成员的类高效。 所以我很欣赏任何有关如何使其成为更具凝聚力和理智的设计的建议。
图片不是我目前所拥有的,但它表示我需要的数据似乎是笨拙地耦合或者我可能只是使这个过于复杂。
答案 0 :(得分:1)
前片,普通片和背片的共同之处在于它们 ARE 片材。因此,您的类层次结构的良好候选者将是:
class sheet { .... };
class front_sheet : public sheet { ...};
class back_sheet : public sheet { ...};
class general_sheet : public sheet { ...};
在sheet
中,您应该放置所有常见元素,当然还有常见行为(例如print()
,save()
,get_size()
,...)。
应该有一个成员函数来计算页面中元素的位置。由于规则取决于页面的类型,它将是sheet()
的虚函数,并且正面和背面可以覆盖默认函数。此方法将帮助您轻松管理不同页面的不同布局。
class sheet {
public:
virtual void get_position (int item_no, int& x, int&y) { x=5; y=14*item_no; }
...
};
class back_sheet : public sheet {
public:
void get_position (int item_no, int& x, int&y) { x=5; y = (item==5 ? 14:0); }
...
};
由于继承确实对应于“is-a”关系,因此您将获得非常强大的设计。
但是,您应该考虑表单的内容。我在这里看到两个主要方向:
编辑; 在考虑了内容之后,可能值得重新回到表格中,并问自己他们的行为有多么不同: