Как заменить статические переменные доступными средствами в базовом классе?
Что мне нужно:
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)
}