0

我需要的:

trait Base {
  import scala.math.{Pi=>mPi, cos=>msoc, sin=>msin}
  static val Pi : Float = mPi.toFloat
  static def cos(phi : Float) : Float = mcos(phi).toFloat
  static def sin(phi : Float) : Float = msin(phi).toFloat
  // ...
  // some useful functions
}
// children use float defined pi, cos and sin without additional boilerplate
class Child1 extends Base
// ...
class Child2 extends Base

那显然行不通。我试过的

trait Base {
  import Base._
  // some useful functions
}
object Base {
  // utility functions
  import scala.math.{Pi=>mPi, cos=>mcos, sin=>msin}
  val Pi : Float = mPi.toFloat
  def cos(phi : Float) : Float = mcos(phi).toFloat
  def sin(phi : Float) : Float = msin(phi).toFloat
}
class Child1 extends Base {
  // use sin and cos inside
}

并且编译器会给出错误,Child1因为它对函数sincos.

如何在将由其后代继承的基类中定义静态成员?

4

2 回答 2

1

如何选择混合特征或从对象导入成员?

而且我认为后者更好。

trait MathUtils { 
  def cos(phi : Float) : Float = ...
}
class Child1 extends MathUtils { cos(1.0F) }

或者

object MathUtils { 
  def cos(phi : Float) : Float = ...
}
class Child1 { 
  import MathUtils._
  cos(1.0F)
}
于 2013-01-12T15:45:20.150 回答
1

你为什么要考虑静态?您需要做的就是创建一个没有参数列表的方法,该方法返回Float常量的形式。

正如您所发现的那样,无论好坏,类或特征范围中的导入都不是继承的。

package rrs.scribble

trait   FloatMath
{
  import scala.math.{Pi => mPi, cos => mcos, sin => msin}

  def Pi: Float = mPi.toFloat
  def cos(phi: Float): Float = mcos(phi).toFloat
  def sin(phi: Float): Float = msin(phi).toFloat
}

object  FM1
extends FloatMath
{
  val twoPi = 2.0f * Pi
}

在 REPL 中:

scala> import rrs.scribble.FM1._
import rrs.scribble.FM1._

scala> twoPi
res0: Float = 6.2831855

scala> cos(twoPi)
res1: Float = 1.0

如您所见, , , 等的静态Pi类型twoPi都是cos,Float不是Double.

于 2013-01-12T17:32:22.133 回答