Java 如果我只能获取某个类的对象,但我的方法只能在子类上工作,如何避免instanceof
具体示例: 我有一个Track类和一个Track switch类,它扩展了Track类Java 如果我只能获取某个类的对象,但我的方法只能在子类上工作,如何避免instanceof,java,instanceof,Java,Instanceof,具体示例: 我有一个Track类和一个Track switch类,它扩展了Track类 class曲目{} class Switch extends Track { boolean state; void changeState() { state = !state; } } 我有一个铁路类,它将ID映射到轨道 class Railway { Map<Integer, Track> IDMap = new Hashmap<>();
class曲目{}
class Switch extends Track {
boolean state;
void changeState() {
state = !state;
}
}
我有一个铁路类,它将ID映射到轨道
class Railway {
Map<Integer, Track> IDMap = new Hashmap<>();
void changeSwitch(Integer id) {
Track temp = IDMap.get(id);
if (temp instanceof Switch) {
((Switch) temp).changeState();
}
}
}
等级铁路{
Map IDMap=newhashmap();
void changeSwitch(整数id){
磁道温度=IDMap.get(id);
if(开关的温度实例){
((开关)温度).changeState();
}
}
}
如何避免在changeSwitch方法中使用instanceof和downcasting?我听说过“告诉,不要问”的规则,但在Track中编写一个只抛出异常的方法感觉非常错误。(为了简化,我特意省略了修饰符)好吧,您不必在Track中创建抛出异常的方法。您可以创建不执行任何操作的方法。然后,您就可以为IDMap中的每个曲目调用changeState了您不能,您需要保证;)那么这是instanceof合法的情况吗?绝对是;)您给出了一个实例,并且您可以确保该类型能够从子类调用特定的方法,因此您需要检查它您可以随时更改您的设计。例如,您可以检查是否可以编写:
Track implements switcheable
并更改state
的存储方式。这是真的,但这仍然被视为良好做法吗?谈到良好做法,为什么您希望在同一个集合中使用不同类型的曲目?也许最好使用组合而不是继承,并将引用放在开关内的轨迹对象上。或者,若你们需要在每次列车经过特定轨道时切换开关,你们可以创建地图。甚至创建属性Track.switch并仅为带有开关的轨迹设置它。我更喜欢后者,只要(temp.getSwitch()!=null)temp.getSwitch.changeState();如果我理解了changeState背后的想法,那么最好创建方法Track.pass()并在Switch中重写它。轨道本身实现铁路区段可能很有用。我需要它们共享相同的ID池,并且我有另一个类IDAdministrator,它根据我用于其他类的某些规则分配ID。其他类也有继承属性。