【问题标题】:Saving variable of unknown subclass type in switch statement在 switch 语句中保存未知子类类型的变量
【发布时间】:2016-08-13 22:32:10
【问题描述】:

我有一个超类 TetrisPiece,每个变体都有子类,即

class PieceI extends TetrisPiece{
}

class PieceJ extends TetrisPiece{
}

etc...

在另一个类中,我有一个基于随机数的 switch 语句,它创建一个随机片段

switch(rand){
      //I
      case 1: {
       PieceI pieceI = new PieceI();
       break;
      }
      //T
      case 2: {
       PieceT pieceT = new PieceT();
       break;
      }
      etc...
      default:
       break;
}

我的目的是提取从 switch 语句的范围生成的片段,以便稍后在课堂上使用它。

由于范围问题,switch 方法显然不起作用,并且我无法在 switch 语句之外创建超类数组,因为由于随机化,我无法转换索引。

感谢任何帮助。

【问题讨论】:

  • 如何您打算以后使用它? TetrisPiece piece;,然后您可以将PieceIPieceJ 实例分配给piece
  • 最好的办法是 PieceI 和 PieceJ 共用一个接口。
  • 用多态替换你的switch语句
  • ElliottFrisch 问题是由于使用了随机子类,我不知道如何分配它们。 @haifzhan 你能更深入地解释一下吗
  • @ElliottFrisch 这似乎不起作用。我尝试访问子类的方法或实例变量,但我只能访问超类

标签: java inheritance scope subclass superclass


【解决方案1】:

创建超类 TetrisPiece 的实例,然后在 switch 语句中为其分配 PieceT、PieceI 等。

TetrisPiece piece;

switch(rand){
  //I
  case 1: {
   piece = new PieceI();
   break;
  }
  //T
  case 2: {
   piece = new PieceT();
   break;
  }
  etc...
  default:
   break;
}

【讨论】:

  • 问题是我无法访问分配给piece的子类的方法或实例变量
  • 您的棋子类型是否具有与超类 TetrisPiece 不同的方法和变量?如果是这样,您应该遵循更严格的多态性设计。理想情况下,俄罗斯方块应该是片段实现的接口。我假设需要在片段之间有所不同的主要事情是旋转它们,所以在你的界面中你会有一个旋转方法,片段会覆盖。
  • 这是一个非常好的建议。在那种情况下的最后一个问题。如果要在每个子类中覆盖旋转方法,并且我没有显式转换“piece”,那么覆盖方法的选择将由我分配给“piece”的哪个子类自动确定,对吗?
  • 是的。基本上你的子类不应该有你的超类没有的任何变量方法。这是一种有点不同的思维方式。因此,例如,每个部分都将有一个向左旋转和向右旋转的方法。在您的俄罗斯方块超类中,您将有一个名为 public void rotateRight() 的方法,其中可能没有代码。然后在您的子类中,您使用特定代码编写相同的方法,当您在答案中使用代码引用该方法时,它将使用子类中的方法而不是超类。
  • 是的,您也可以覆盖 getter 和 setter。如果您想了解有关继承和多态性的更多信息,请阅读 Oracle 提供的一些文档。关于如何使用接口、覆盖方法等有一些很好的解释和代码示例。docs.oracle.com/javase/tutorial/java/IandI/index.html
猜你喜欢
  • 2019-04-12
  • 2019-04-01
  • 2023-03-10
  • 2022-08-17
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
相关资源
最近更新 更多