2013-08-22 310 views
0

假设您有一组对象,它们排列在一个层次结构中。也就是说,有一个包含所有对象的对象,那么这个对象指的是同一类型的几个对象,但是在较低的层次上,并且这些对象中的每一个都指向同一类型的几个对象,而较低级别的对象,以此类推可变数量的步骤。例如,让我们考虑这些对象是政府,所以最高级别是全球性的,那么全球会有国家和部落,国家会有城镇,城镇会有房子和企业等等。所有这些政府都推广了政府抽象类,所以它们都有相同的类型。通用嵌套for循环

我需要遍历整个层次结构中的所有对象,但因为我不知道运行时的完整结构,所以我必须以广义的方式来完成。我只知道确实存在一个全球性的政府,然后我必须检查哪些子政府必须进行。

我发现这样做的一种方法是给超类一个名为getSubGovs()的函数,它返回所有子政府的列表,以及这些子政府每个从getSubGovs()返回的内容。我希望这是有道理的。这是一个很好的方式来解决这个问题。

我正在寻找的是一种方法来做到这一点,而不必添加一个函数到超类,在我正在处理一个API的情况下,不能修改超类。什么将是一个优雅的方式来做到这一点?

+0

是否要对结构中的所有对象执行通用操作?如果是这样,什么类型的操作?如果不是,你为什么要迭代它? – Bohemian

回答

0

这种结构被称为tree

通常情况下,每个树节点具有相同类型,具有getChildren()方法或类似的 - 你的情况getSubGovs()。听起来每个班都有自己的方式让孩子们,所以一个简单的抽象是不可能的。

要应用的标准软件模式可以通用方式浏览树,但是由于您无法修改类,因此您也可能需要facade pattern

0

我不是100%肯定你想达到什么,但我相信你会想在这里什么是多态,即继承虚函数(我不知道你所使用的语言,但C++中,例如,支持这个)。

基本上,你会作出全球政府基类,和所有其他类的派生类这将继承全球政府(或对方)。通过继承,您可以建立您想要的层次结构(例如,通过在层次结构中继承上级的层次结构中的类降低)。

此页包括继承: http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

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

以下是一个很酷的部分:当您在遍历子类和超类的混合时,对所有类都使用基类指针。即使从基类指针调用派生类的函数,因为您声明了需要虚函数的函数,C++将根据指针指向的对象的类型来确定要调用的函数版本。该确定是在运行时进行的,因此您甚至不必担心指针指向层次结构中的哪个对象。

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

希望这是你想要的东西。

编辑:

根据此页:

How do you find all subclasses of a given class in Java?

没有巧妙的方法,你必须看看在类路径中的每个类。

+0

那么,我正在使用Java,它与C++有很多相似之处。我为我的解决方案版本使用了继承,它非常优雅,但并不总是可用。我想我可能没有把这个问题说得很好。这个问题比任何东西都更具假设性,我对可从外部查看层次结构的逻辑算法感兴趣(只能访问函数getImmediateSubGov(),该函数仅返回直接位于关联对象下方的政府,而不是,它是子博客的子博客。)这是为了给我一个我不能改变的API的情况。 – Kammeot

+0

@InspiredOne啊我明白了。我编辑了我的答案。 – Joohwan