更好地覆盖函数定义的方法

时间:2014-10-24 16:26:46

标签: scala

我从库中扩展了一个抽象类,我希望覆盖一个函数定义,并使用超类的定义作为后备。

如果父类的方法被定义为PartialFunction,我可以使用orElse。由于它不是,我正在做下面的事情(将父函数解除为部分函数,​​因此我可以使用orElse)。它有效,但是当我怀疑有更好/更优雅的方式时,它就是其中之一。有吗?

abstract class ThingICantChange {
    def test:Int=>String = {
      case 1 => "one"
      case 2 => "two"
      case _ => "unknown"
    }
}

class MyClass extends ThingICantChange {
  def myChanges:PartialFunction[Int,String] = {
    case 2 => "mytwo"
    case 3 => "three"
  }
  override def test = myChanges orElse Function.unlift(x => Some(super.test(x)))
}

1 个答案:

答案 0 :(得分:3)

我会这样做:

class MyClass extends ThingICantChange {
  override def test: Int => String = {
    case 2 => "mytwo"
    case 3 => "three"
    case x => super.test(x)
  } 
}

如果你想从super.test构建一个部分函数,​​那么这里是一个干净的方法:

override def test = myChanges orElse PartialFunction(super.test)