包含抽象超类列表的类,我需要#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的构造函数不能创建一个空板,然后添加Tiles? 【参考方案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所有子类吗?的主要内容,如果未能解决你的问题,请参考以下文章

第6章:继承和抽象类

用 List<?> 成员定义抽象泛型类

如何判断是不是从超类添加了子视图?

抽象abstract

抽象和接口

Java中终结类和抽象类