Как заменить статические переменные доступными средствами в базовом классе?

Что мне нужно:

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 что это ничего не делает с функциями sin а также cos,

Как я могу определить статические члены в базовом классе, которые будут наследоваться его потомками?

2 ответа

Решение

Почему вы думаете с точки зрения статики? Все, что вам нужно сделать, это создать метод без списка аргументов, который возвращает 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,

Как насчет выбора смешивания в признаке или импорта членов из объекта?

И я думаю, что последний лучше.

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)
}
Другие вопросы по тегам