假设我们有这样的事情:
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孩子,使用访问者等,但这可能是不可行的,因为这些操作可能依赖于Collection中的其他MyClass子项。一个MyClass孩子可能不会决定自己采取的行动,甚至任何单一的MyClass集合。其中一些行动可能是累积的,取决于许多其他潜在的累积因素。
有没有“好”的方法来解决这个问题,或者我只是被诅咒到丑陋的类型条件或类似的东西?我考虑在MyClass中使用Generics并在所有孩子身上使用具体类型。这可以简化对象的检索,但仍然需要一个大的条件块。
答案 0 :(得分:0)
你在你的问题中丢弃了“好”的做法。在这种情况下,泛型无济于事。是的,你会被诅咒到一个讨厌的地方,因为丑陋的类型检查使用。您可以使用名为category
的公共实例成员以及getCategory
中定义的相应访问者MyClass
来伪装类型检查。如果可以switch
,他们会if
getCategory()
。if
但是,无论是否检查类型,谴责您的人都可能不喜欢switches
和for(MyClass e: collection )
e.doYourAction();
。而且他们也可以聪明并且了解你想要做什么。除了
{{1}}
是“坏”。
现在,对于似乎根本没有规范的软件,你可能会得到赦免。