包含抽象超类列表的类,我需要#include所有子类吗?
Posted
技术标签:
【中文标题】包含抽象超类列表的类,我需要#include所有子类吗?【英文标题】:Class containing list of abstract superclass, do I need to #include all subclasses? 【发布时间】:2014-05-25 13:37:01 【问题描述】:我正在制作棋盘游戏。棋盘游戏有一个类Board
,其中包含一个QList<Tile*>
。 Tile
是一个抽象类,它有许多子类来表示不同种类的瓦片,它们有不同的功能。现在,由于Board
的构造函数需要将这些子类的所有对象放入QList<Tile*>
中,我是否需要在Board
中包含每个子类?
如果是这样,我很确定这是不好的做法,那么有什么办法可以规避这种情况吗?
【问题讨论】:
为什么Board
的构造函数需要做Tile
的子类?为什么Board
的构造函数不能创建一个空板,然后添加Tile
s?
【参考方案1】:
我需要在 Board 中包含每个子类吗?
如果您尝试使用子类,则必须确保包含它。我认为这里没有什么可以规避的。
如果这需要在多个地方完成,您可以做一件事,即不仅仅是在您的构造函数中,然后您可以将包含放入共享包含中。然后,这几个地方将包含共享的包含。
例如,不幸的是,Qt 最终用户包含整个模块以避免几行包含是很常见的。恕我直言,这是一种不好的做法。
这是您的案例的示例。
main.cpp
#include "test.h"
#include "foo.h"
#include "bar.h"
#include "baz.h"
int main()
Test *test1 = new Foo();
Test *test2 = new Bar();
Test *test3 = new Baz();
return 0;
test.h
#ifndef TEST
#define TEST
class Test
public:
virtual ~Test()
;
#endif
foo.h
#ifndef FOO
#define FOO
#include "test.h"
class Foo : public Test
;
#endif
bar.h
#ifndef BAR
#define BAR
#include "test.h"
class Bar : public Test
;
#endif
baz.h
#ifndef BAZ
#define BAZ
#include "test.h"
class Baz : public Test
;
#endif
main.pro
TEMPLATE = app
TARGET = main
CONFIG -= qt
QT -= core gui
HEADERS += bar.h baz.h foo.h test.h
SOURCES += main.cpp
构建并运行
qmake && make && ./main
尝试删除任何包含或将其替换为main.cpp
文件中的前向声明,您将看到它不再编译。
【讨论】:
感谢您提供如此有理有据的回复以及额外的信息。我只是想确定一下,我正在为 Uni 任务制作这个项目,他们非常重视 GRASP 模式。我只是担心在我的 UML 中有这么多关联行可能会为它们带来一些标志,包括内聚和耦合等等。以上是关于包含抽象超类列表的类,我需要#include所有子类吗?的主要内容,如果未能解决你的问题,请参考以下文章