Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我只能获取某个类的对象,但我的方法只能在子类上工作,如何避免instanceof_Java_Instanceof - Fatal编程技术网

Java 如果我只能获取某个类的对象,但我的方法只能在子类上工作,如何避免instanceof

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<>();

具体示例: 我有一个Track类和一个Track switch类,它扩展了Track类

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。其他类也有继承属性。