为什么我需要在以下代码中“覆盖def toString():String = x.toString”,如何工作?

时间:2014-02-02 12:09:48

标签: scala

/* scala code;
   by this code I am going to sum two integers with one class that
   has an one input as a parameter
*/

object Rationals {
  def main (args : Array[String]) {
    var p  = new rational(1)
    var pp = new rational(2)
    println(p.add(pp)) // **I expect 3 in result**
  }
}

/*
 * the class rational with 2 calls in main function,
 * sums the parameters of two calls
 */ 

class rational(x: Int) {
  def n = x

  def add (that: rational) = new rational(n + that.n) 

  override def toString(): String = x.toString  /* this line is my question */

  /*
   * n most to be equals to 1
   * and than.n most be equals to 2 =====> n+ than.n = 1+ 2 = 3
   */                        
}

4 个答案:

答案 0 :(得分:0)

缺少等号:def add (that : rational) =

答案 1 :(得分:0)

实现此操作的另一种方法,包括运算符重载和implicits(以及字符串插值),

case class Rational (i: Int) {
  def +(that: Rational) = Rational(i+that.i)
}

object Rationals extends App {
  implicit def int2Rational (i: Int) = Rational(i)

  val r1 = Rational(1)
  val r2 = r1 + 3

  println(s"$r1+3=$r2")
}

然后

scala> Rationals.main(Array())
Rational(1)+3=Rational(4)

答案 2 :(得分:0)

可能需要覆盖toString:

class rational(x: Int) {
  def n = x

  def add(that: rational) =
    new rational(n + that.n)

  override def toString(): String = x.toString
}

答案 3 :(得分:0)

这里有很多不妥之处

<强> 1。格式错误的代码

您如何期望阅读自己的代码?缩进遍布整个地方,你没有与例如:周围的间距。在我看到发生了什么之前,我不得不重新格式化问题中的代码。

<强> 2。使用var,其中val更合适:

var p  = new rational(1)
var pp = new rational(2)
println(p.add(pp)) // **I expect 3 in result**

为什么var?你从不改变ppp

第3。通过def

重新公开构造函数值
class rational(x: Int) {
  def n = x
  ...
}

如果您希望该值为public,则使用case类,或在类签名中将其标记为val,这样做无效。

class rational(val n: Int) {
  ...
}

<强> 4。作为班级名称,rational应该以大写字母开头

class Rational(...

至于原来的问题......

toString必须声明为override,因为它被定义为Object类中的具体(即非抽象)方法,以及所有类JVM继承自Object

在Scala中,每当您从超类型重新定义(覆盖)方法时 - 而不是实现abstract方法 - 您必须使用override关键字。这是为了防止你意外地通过继承来重新定义已经成为你的类的成员的东西。

在这种情况下,它被覆盖,以便String的{​​{1}}表示是包含的数字。 Rational的默认实现只是为您提供了JVM提供的哈希代码,这很少有用。