Java - 抽象类的集合,子类包含不同的对象 - 有什么"good"方法来处理这些包装的对象吗?



假设我们有这样的东西:

public abstract class MyClass {
    //Stuff in here
}
public class MyClassA extends MyClass {
    private String thingie; //Along with getter/setters, of course
    //Other stuff
}
public class MyClassB extends MyClass {
    private List<Integer> thingies; //Again, getters and setters to go with
    //Other stuff
}

让我们假设我们有任意数量的扩展MyClass的类,每个类都有自己的不同类型的实例变量,尽管有些类可能具有相同的类型。这是一种不幸的必然。现在,让我们假设我们有一个MyClass的集合。我们有一个集合,里面充满了任意数量的子类,每个子类中都包含一个对象。假设我需要迭代这个Collection,从任意数量的元素中检索所述对象,并对其执行操作、存储、操作、将其发送到其他地方等。除了扩展object之外,这些对象没有任何共同点。

我可能可以简单地将这些操作委托给MyClass的子级,使用访问者等,但这可能不可行,因为这些操作可能依赖于集合中的其他MyClass子级。一个MyClass子级可能不会自行决定要执行的操作,甚至不会决定MyClass的任何单个集合。这些行动中的一些可能是累积的,并取决于许多其他潜在的累积因素。

有没有什么"好"的方法来处理这个问题,或者我会被诅咒到丑陋的类型检查条件或类似的东西?我考虑在MyClass中使用泛型,并在所有的孩子身上使用具体类型。这可以简化对象的检索,但仍然需要一个大的条件块。

你在问题中放弃了"好"的方法。在这种情况下,泛型没有帮助。是的,你会因为类型检查的丑陋使用而被诅咒到一个肮脏的地方。可以使用名为category的公共实例成员及其在MyClass中定义的相应访问器getCategory来伪装类型检查。如果可以的话,他们会在getCategory()上执行一个switch(而不是多个if)。然而,谴责你的人可能不喜欢ifswitches,无论他们是否在检查类型。他们也可以很聪明,理解你想做什么

for(MyClass e: collection )
    e.doYourAction();

是"坏"。

现在,对于那些似乎根本没有规范的软件,你可以被赦免。

最新更新