0

假设您有一组按层次结构排列的对象。即有一个包罗万象的对象,那么那个对象指代几个同类但层次较低的对象,而这些对象中的每一个对象又指代几个同类但层次较低的对象,以此类推。可变数量的步骤。例如,让我们将这些对象视为政府,因此最高级别将是全球,然后全球将有国家和部落,国家将有城镇,城镇将有房​​屋和企业等。所有这些政府都扩展了 gov 抽象类,因此它们都共享同一类。

我需要遍历整个层次结构中的所有对象,但是因为我在运行时不知道完整的结构,所以我必须以一种概括的方式来做。我只知道有一个全球政府,然后我必须检查它必须进行哪些子政府。

我发现的一种方法是为超类提供一个名为 getSubGovs() 的函数,该函数返回所有下级政府的列表以及每个下级政府从 getSubGovs() 返回的内容。我希望这是有道理的。这是重现问题的好方法。

我正在寻找的是一种无需向超类添加函数的方法,对于我正在处理 API 并且无法修改超类的情况。什么是一种优雅的方式来做到这一点?

4

2 回答 2

0

我不能 100% 确定您想要实现什么,但我相信您在这里想要的是多态性,即继承虚函数(我不知道您使用的是哪种语言,但例如 C++ 支持这一点)。

基本上,您将使Global Government成为基类,而您的所有其他类将成为继承Global Government(或彼此)的派生类。通过继承,您可以建立所需的层次结构(例如,通过使层次结构中较低的类从层次结构中较高的类继承)。

此页面涵盖继承: http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

现在对于迭代部分:首先,您在基类(例如全球政府)中声明函数/方法虚拟(使用关键字virtual)。派生类将覆盖此函数并根据需要对其进行自定义。请注意,派生类中不需要 virtual 关键字。

这是很酷的部分:当您迭代混合子类和超类时,您使用所有的基类指针。即使你从基类指针调用派生类的函数,因为你声明了你需要的虚函数,C++ 会根据指针指向的对象的类型来确定调用哪个版本的函数。此决定是在运行时做出的,因此您甚至无需担心指针指向层次结构中的哪个对象。

此页面涵盖虚拟功能:http ://en.wikipedia.org/wiki/Virtual_inheritance 。

希望这是你想要的那种东西。

编辑:

根据此页面:

如何在 Java 中找到给定类的所有子类?

没有优雅的方法,您必须查看类路径上的每个类。

于 2013-08-22T00:54:17.473 回答
0

这种结构称为

通常,每个树节点都有相同的类型,它有一个getChildren()方法或类似的 - 在你的情况下getSubGovs()。听起来每个班级都有自己的获取孩子的方式,因此不可能进行简单的抽象。

可以以通用方式导航树的标准软件模式是访问者模式,但由于您无法修改类,因此您可能也需要外观模式

于 2013-08-22T15:25:51.553 回答