如何在不使用条件或循环的情况下创建此计算器

时间:2019-03-08 01:00:14

标签: java scala class methods

我想在Scala中创建一个计算器,我需要将小数和加法运算结合起来。加法动作将需要覆盖先前的运算符动作,因此,如果用户按下[4,-,+,2,=],则将返回6。问题是两个动作都必须在不使用条件的情况下执行,例如匹配/大小写或循环。该怎么办?这是我尝试过的。

import javafx.event.{ActionEvent, EventHandler}

class Calculator(){
    //this is what will appear on the calculator
    def displayNumber(): Double={
        0.0
    }

class DecimalAction(calculator: Calculator) extends EventHandler[ActionEvent] {
override def handle(event: ActionEvent): Unit = {
  calculator.displayNumber() = calculator.displayNumber() + ".".toInt
}
}

class AdditionAction(calculator: Calculator) extends EventHandler[ActionEvent] {
    override def handle(event: ActionEvent): Unit = {
      calculator.displayNumber() = calculator.displayNumber() + "+".toInt
}
}

1 个答案:

答案 0 :(得分:1)

在您的计算器课程中,您需要跟踪下一步将进行的操作(如果有)。

var nextOperation: Optional[Operation] = None

我将在下面定义Operation。然后,在操作类中,您可以设置nextOperation,如果已经将其设置为其他值,则将其覆盖。

class DecimalAction(calculator: Calculator) extends EventHandler[ActionEvent] {
  override def handle(event: ActionEvent): Unit = {
    calculator.nextOperation = Some(Decimal)
  }
}

class AdditionAction(calculator: Calculator) extends EventHandler[ActionEvent] {
  override def handle(event: ActionEvent): Unit = {
    calculator.nextOperation = Some(Add)
  }
}

现在,我们使用Operation方法将combine定义为密封特征,该方法可以完成两个数字的加,减或十进制连接。当您在combine上调用Operation时,它将使用dynamic dispatch而非条件来选择正确的方法。

sealed trait Operation {
  /** Combine the existing number with the new digits under the current operation. */
  def combine(x: Double, y: Seq[Int]): Double
}

case object Decimal extends Operation {
  def combine(x: Double, y: Seq[Int]) = ???
}

case object Add extends Operation {
  def combine(x: Double, y: Seq[Int]) = ???
}

其余的取决于您要如何实现计算器,但是您可能不得不考虑一些运算顺序(例如,十进制可能优先于加法运算。)