2013-01-12 66 views
0

我需要更換使用Scala可用的手段靜態變量:如何在基類

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錯誤。

如何在基類中定義一個靜態成員,並由其後代繼承?

+0

如何在文件的開頭添加import語句? – sschaef

回答

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 

正如你看到的,靜態類型的PitwoPicos等都是Float,不Double

+0

我不能用函數def替換val。正如我已經嘗試過使用scala繼承系統,我可以使用val而不是def,但反之亦然會被類型系統拒絕。所以val和def基本上是不同的實體,並且可能def比val更加昂貴 – ayvango

+0

不正確。如果使用'val'來保存一個常量,那麼每個實例都有一個(冗餘)副本,而使用'def'時,它將成爲字節碼的一部分,並被所有實例共享。而且,對'val'的訪問仍然通過訪問器方法。不管怎樣,JIT本地代碼編譯可能會在運行時使它們相同。 –

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) 
} 
+0

我現在正在使用方法#2,但它困擾我,因爲孩子真的很小,導入語句脫穎而出 – ayvango