假设您有一组排列为层次结构的对象。也就是说,存在一个包罗万象的对象,那么该对象指的是同一类但在较低级别的几个对象,并且这些对象中的每一个引用相同种类但较低级别的多个对象,依此类推可变数量的步骤。例如,让我们将这些对象视为政府,因此最高级别是全球性的,那么全球将拥有国家,部落,国家将拥有城镇,城镇将拥有房屋,企业等。所有这些政府都扩展了政府抽象类,所以它们都有相同的类型。
我需要遍历整个层次结构中的所有对象,但由于我不知道运行时的完整结构,我必须以通用的方式进行。我只知道有一个全球政府,然后我必须检查它必须进行哪些次级政府。
我发现这样做的一种方法是给超类提供一个名为getSubGovs()的函数,该函数返回所有子政府的列表以及每个子政府从getSubGovs()返回的内容。我希望这是有道理的。这是一个很好的方法来重现问题。
我正在寻找的是一种方法,无需向超类添加函数,因为我正在处理API并且无法修改超类。这样做会有什么优雅的方式?
答案 0 :(得分:0)
我不是100%肯定你想要实现的目标,但我相信你想要的是多态性,即继承和虚拟功能(我不知道你正在使用哪种语言,但C ++,支持这一点)。
基本上,您将全球政府 基类,以及所有其他类派生类将继承全球政府(或彼此)。通过继承,您可以建立所需的层次结构(例如,通过使层次结构中的类 lower 继承层次结构中的更高类)。
此页面介绍了继承: http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
现在为迭代部分: 首先,在基类中声明函数/方法虚拟(使用关键字虚拟)(例如全球政府)。派生类将覆盖此函数并根据需要对其进行自定义。请注意,在派生类中不需要虚拟关键字。
这是很酷的部分:当您在迭代子类和超类的混合时,您可以使用基类指针。即使从基类指针调用派生类的函数,因为您声明了需要虚函数的函数,C ++根据指针指向的对象类型确定要调用的函数版本。此确定在运行时进行,因此您甚至不必担心指针指向的层次结构中的哪个对象。
此页面涵盖虚拟功能:http://en.wikipedia.org/wiki/Virtual_inheritance。
希望这是你想要的东西。
编辑:
根据这个页面:
How do you find all subclasses of a given class in Java?
没有优雅的方法,你必须查看类路径上的每个类。
答案 1 :(得分:0)
这种结构称为tree
通常,每个树节点都具有相同的类型,具有getChildren()
方法或类似方法 - 在您的情况下getSubGovs()
。听起来每个班级都有自己的方式来获得孩子,所以不可能直接抽象。
要应用的标准软件模式可以以通用方式导航树,visitor pattern,但由于您无法修改类,因此您可能还需要facade pattern。