2014-07-04 32 views
0

我有一個名爲A的類,它擴展了特性XX有一個抽象變量x已在A類中實現。類A使用特徵X中名爲foo的功能之一。我正在嘗試製作類A的伴侶對象,並在其中放入一些名爲Ofoo的「靜態」方法。我的問題是Ofoo使用foo。於是,我試着做這樣的事情:通過對象擴展特質

trait X{ 
val x:String 
def foo = { 
    //Full implementation here 
    } 
} 

case class A extends X{ 
val x = "barbaz" 
// Class uses foo 
} 

object A extends X{ 
def Ofoo = { 
    //This also needs to use foo 
    } 
} 

我得到一個錯誤說A不能被實例變量x對象不特質X定義。 我應該如何構造A,以便它可以使用特徵中定義的功能foo

+2

你應該解釋你真正想要完成的事情(你真正的問題,而不是抽象的問題)。可能有一個簡單的解決方案,但很難說如果我們不知道你在做什麼。 – toto2

回答

3

編譯器的行爲與其應該一樣。可以有兩件事:foo使用x

如果是這種情況,則需要在編譯器說明的地方聲明x。你可以說:

object A{ 
    def ofoo = new X{val x = "default"}.foo 
} 

如果foo不使用x那麼我不知道如果它甚至應該屬於性狀X。然後,您可以創建一個object X,然後有foo裏面是這樣的:

trait X{ 
    val x:String 
} 

object X{ 
    def foo = {} 
} 
+0

嗯,我可以把函數'foo'放到一個對象中,但是如何確保只有類'A'(和它的單例對象'A')可以訪問它? –

+0

嗯,我不確定。 – Jatin

1

如何實現在Ax?這只是一個對象;它必須遵守相同的規則,其中包括實現正在擴展的任何類/特徵的抽象成員。

object A extends X { 
    val x = "hello" 
    ... 
} 

只是因爲它已經從X繼承並實現x一個class A的同伴對象,並不意味着object X神奇地重新使用它。

實際上,從技術上講,一個類和它的伴侶對象是沒有關聯的;他們唯一的關係是按慣例存在的


在另一方面,如果你想確保的x值是在這兩個類A以及對象A,你可以在object A定義val x並在class A該值提取相同:

class A extends X { 
    val x = X.x 
    ... 
} 
object A extends X { 
    val x = "shared-value-of-x" 
    ... 
} 
+0

「事實上,從技術上講,一個班級和它的同伴對象是沒有聯繫的,他們唯一的關係是按照慣例存在的。」並不完全:他們看到對方的私人方法和領域。 –

+0

我懷疑我忘記了一些東西,謝謝! –

0

在任何速率,x必須由對象A或在其超類/ supertraits之一來定義。

基於先前提出的建議和OP的答覆,我會認爲富不應該容易從其他地方,這樣的:

package pack { 

    trait X{ 
    val x:String 
    } 

    // Reachable only in the same source file 
    sealed trait Y extends X{ 

    // if foo doesn't use x below, no need to extend X, though 
    private[pack] def foo = { 
     //Full implementation here 
     println("x = "+x) 
    } 
    } 

    case class A() extends X with Y{ 
    val x = "barbaz" 
    // Class uses foo 
    foo 
    } 

    object A extends X with Y{ 
    val x = "barbatruc" 
    def ofoo = { 
     //This also needs to use foo 
     foo 
    } 
    } 

} 

其實我也很難理解的任擇議定書想要什麼。我同意toto2。