2015-03-03 147 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