2012-07-27 55 views
2

獲取類字段我有一個特點:從特質

trait A { 
    /*Some methods*/ 
} 

而且我有很多的類:

class B(val argument: SomeClass) extends A { 
    /*Some methods*/ 
} 

我想從特徵參數。我可以在每個類和特質創建方法getArgument:

trait A { 
    def getArgument: SomeClass 
    /*Some methods*/ 
} 
class B(val argument: SomeClass) extends A { 
    def getArgument = argument 
    /*Some methods*/ 
} 

或者使用反射:

trait A { 
    def getArgument = { 
    val f = this.getClass.getDeclaredField("argument") 
    f.setAccessible(true) 
    f.get(this).asInstanceOf[SomeClass] 
    } 
    /*Some methods*/ 
} 
class B(val argument: SomeClass) extends A { 
    /*Some methods*/ 
} 

有沒有更好的方式來做到這一點?

回答

3

你可以有抽象瓦爾斯:

trait A { 
    val argument: SomeClass 
} 

class B(val argument: SomeClass) extends A 

你甚至不需要約束它是一個VAL:

trait A { 
    def argument: SomeClass 
} 

class B(val argument: SomeClass) extends A 

class C extends A { 
    def argument : SomeClass = .... 
} 
1

一個老問題,但對於搜索的緣故...... 你可以定義類型this並訪問其成員:

class ArgContainer(val argument: SomeClass) 

class B(argument: SomeClass) extends ArgContainer(argument) with A 
class C(argument: SomeClass) extends ArgContainer(argument) with A 

trait A { 
    this: ArgContainer => 

    def print() = { 
    println(this.argument) 
    } 
} 

查看更多這裏How to use scala trait with `self` reference?