我有一个抽象类A和类B和C,类B和C扩展了A,我需要把列表中的B和C固定在一起,比如说List。但是,B和C有独特的方法,所以并不是List中的所有项都可以用来调用某些方法的。除非我是在降调 这被认为是一种设计气味。
我需要将B和C保持在同一个列表中,因为我想根据它们的共享属性进行排序,我可以这样做。在这种情况下,把它们保持在同一个父类型的列表上,然后降序是否是一个不好的设计?
我需要把B和C放在同一个列表中,因为我想根据它们的共享属性进行排序,我可以这样做。
只要要求保持列表中混合类型的排序即可 B
, C
两者都延伸 A
来调用它们的非继承方法,你别无选择,只能使用 List<A>
包含所有类型。
虽然我也尽量避免降频,但这并不意味着在某些情况下它既无用也无必要。
for (A item: sortedList) {
if (item instanceof B) {
Whatever fieldB = ((B) item).getFieldB(); // using non-inherited method of B
} else if (item instanceof C) {
Whatever fieldC = ((C) item).getFieldC(); // using non-inherited method of C
} else {
// either only A or anything different that extends A
}
}
从Java 14开始,由于 JEP 305: Pattern Matching for instanceof(模式匹配),这样的事物就会变得不那么啰嗦。
for (A item: sortedList) {
if (item instanceof B b) {
Whatever fieldB = b.getFieldB(); // using non-inherited method of B
} else if (item instanceof C c) {
Whatever fieldC = c.getFieldC(); // using non-inherited method of C
} else {
// either only A or anything different that extends A
}
}