2017-07-18 19 views
0

在該代碼中,在B參數a距離A.aScala的:在擴展CLASSE重用參數名稱

class A(var a:String) 

class B(a:String) extends A(a) { 
    println(a) // Use B.a 

    def p() { 
    println(a) 
} 
} 

val b=new B("abc") 
b.p() // "abc" 
b.a="def" 
b.p() // "abc" and not "def" 

不同我可以在乙這樣重命名參數:

class B(_a:String) extends A(_a) { 
    println(_a) // Use B.a 

    def p() { 
    println(a) 
} 
} 

但我想保留Scaladoc的名稱'a',以及與語法B(a="def")的兼容性。 我如何解決這種情況?

+0

訴諸構圖而不是繼承是否可行? – stefanobaghino

+1

使類不可變將解決問題。它會迫使你'val res = b.copy(a =「def」)'。 (_a) –

回答

1

可以使主構造私人和添加具有a作爲名稱的次級構造:

class B private (_a:String, ignore: Unit) extends A(_a) { 
    def this(a) { this(a,()) } 

    println(_a) // Use B.a 

    def p() { 
     println(a) 
    } 
} 

但是,這似乎是它可以很容易導致混亂。所以我會尋找替代設計,正如這個問題的評論所表明的那樣。

+0

該代碼必須是 class B private(_a:String,ignore:Unit)extends A(_a)def this(a:String){this(a,())} println(_a)// Use Ba def p(){ println(a) } } – pprados

+0

固定的,我有點匆忙。 –