2013-10-02 30 views
2

假設我有以下特點和類延伸的特點我可以從Scala中的超類繼承訪問修飾符嗎?

trait T { protected def f() } 

class C extends T { def f(): println("!") } 

object Main extends App { 
    val c = new C 
    c.f() // should be a compile error 
} 

我宣佈fprotected在聲明T,以便它可以從C範圍內被調用,而不是別人。換句話說,C.f()應該是一個編譯錯誤。我認爲Tprotected修飾符會結轉,但它不會。

我可以在C的聲明中重新聲明C.f()protected,但我寧願不必重複自己。有沒有其他的方式在Scala中做到這一點?

回答

4

簡答:沒有。

不指定訪問修飾符並不意味着「繼承訪問修飾符」,它表示「公共」。斯卡拉沒有public關鍵字,如果它沒有這樣工作,那麼在重寫時就沒有辦法真正使受保護的成員公開。

換句話說,您必須重複protected修飾符。

1

我加入ghik的回答,並且想要添加更多內容。

如果你有一個trait T { protected def f() }那麼你的擴展類可能已宣佈f()def f()(這意味着public作爲ghik說的)或protected def f(),但不private def f()

一般的規則是你不能訪問類型更改爲更嚴格的一個,你只能拉大,所以,如果你想在你的性狀的簡單def f(),類甚至不能聲明爲protected

相關問題