我想與同伴幾個類,以便從一個類的實例,以及從同伴對象訪問共享值的對象,當我沒有一個實例對象。斯卡拉:動態訪問同伴從子類
最後我想解析字符串和圓創建匹配的類的實例,也是另一種方式,創建從實例的字符串。
下面的代碼工作,但似乎過於複雜:
abstract class Person(val age: Int = 0) {
val pronoun: String
override def toString = pronoun + " is " + age + " years old"
}
class Man(override val age: Int) extends Person {
val pronoun = Man.pronoun
}
class Woman(override val age: Int) extends Person {
val pronoun = Woman.pronoun
}
object Man extends Person {
val pronoun = "he"
}
object Woman extends Person {
val pronoun = "she"
}
object Person {
def fromString(pronoun: String, age: Int): Option[Person] = {
pronoun match {
case Man.pronoun => Some(new Man(age))
case Woman.pronoun => Some(new Woman(age))
case _ => None
}
}
}
// Man.pronoun
// -> should return "he"
// Woman.pronoun
// -> should return "she"
// new Man(30).toString
// -> should return "he is 30 years old"
// Person.fromString("she", 20)
// -> should return a Some(Woman) with age = 20
所以,對於這個工作,我爲每個子類的類和同伴對象和手動引用來自同伴對象pronoun
(例如val pronoun = Man.pronoun
)。
邊注:在抽象類設置的默認值age = 0
使事情進一步下跌更容易一點,但它似乎沒有吧?
我使用特點等,但都沒有成功嘗試。有沒有更好的方式來實現這個重複性較低的代碼?
這是正確的,我上面的例子是一個簡化。我想我的問題是,我沒有考慮將「代詞」放在對象中。其次,我不知道我確實可以在這裏使用一個特質,而不是抽象類。雖然與第二個答案非常相似,但我會選擇這一個爲正確的,因爲我發現特質解決方案在這裏略顯清晰。謝謝! – Nick