2015-03-03 59 views
2

不知道這樣的事情是否甚至可能,但我期望達到的效果如下: 我有一個被稱爲物理位置的特性,它需要一個int(對應一個人的城市)作爲子類的變量存在。斯卡拉OO-可選擴展特性

class Building extends PhysicallySituated //A building has an address 
class OilTanker extends Ship //An oiltanker is always moving around 
class Yacht extends Ship with Option[ PhysicallySituated ] //a Yacht could have an address 

我該如何模擬這種情況,因爲PhysicallySituated具有在位置上操作的方法?我在尋找的是調用船上的方法返回一個可選的值,它是PhysicallySituated中的原始方法返回的類型。我知道我可以使用PhysicallySituated的一個實例並調用這個實例的方法,但是這違背了封裝的最佳實踐。

我要指出,我的斯卡拉的理解是中等水平,但我願意,如果他們指出

回答

3

會爲你的工作讀了任何先進的理念? (RAN使用Scala REPL):

trait Address 

case object EmptyAddress extends Address 

case class NonEmptyAddress(addrStr: String) extends Address 

trait Situated { 
    val address: Address 
} 

trait OptionallySituated extends Situated { 
    val address = EmptyAddress 
} 

trait PhysicallySituated extends Situated { 
    val address: NonEmptyAddress 
} 

class Building extends PhysicallySituated { 
    val address = NonEmptyAddress("this is my place") 
} 

class Ship 

class OilTanker extends Ship 

class Yacht extends Ship with OptionallySituated 

scala> val stuff = List(new Building, new Yacht) 
stuff: List[Situated{val address: Product with Serializable with Address}] = List([email protected], [email protected]) 

scala> stuff.map(_.address) 
res0: List[Product with Serializable with Address] = List(NonEmptyAddress(this is my place), EmptyAddress)       

您可以使用Option[Address]SomeNone而不是定義上面以及地址類。

+0

這很好,謝謝! – 0fnt 2015-03-03 18:13:38