0

假设我们有这样的事情:

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 中使用泛型并在所有孩子上使用具体类型。这可以简化对象的检索,但仍然需要一个大的条件块。

4

1 回答 1

0

您在问题中放弃了“好”的做法。在这种情况下,泛型将无济于事。是的,你会因为丑陋地使用类型检查而被诅咒到一个令人讨厌的地方。您可以使用一个名为的通用实例成员来伪装类型检查,例如,以及它在 中定义category的相应访问器。如果可以(而不是多个s),他们会在. 但是,会谴责你的人可能不喜欢s,无论他们是否检查类型。他们也可能很聪明,并且了解您要做什么。除了getCategoryMyClassswitchifgetCategory()ifswitches

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

不好”。

现在,对于似乎根本没有规范的软件,你可以原谅。

于 2013-08-26T21:59:30.033 回答