有没有办法使用Scala的类型系统来简洁地指定完整对象图的上下文相关子图?Scala可以约束一个对象图,以便只有那些与上下文相关的对象才可见?
DCI认为你经常有一个相当复杂的对象图,但在任何一种用例中,你通常只想使用一个子图。您有一个Foo
,它有一个Bar
和一个Bat
,但是在使用情况1时,您只关心Bar
,而在使用情况2时只关心Bat
。
举例来说,假设你有这样的结构,基于role1用例需要Foo->Bar->Baz->Bin
和role2所用例需要Foo->Bat->Baz->Buz
:
class Foo{
val bar = new Bar() //Only relevant to Role 1
val bat = new Bat() //Only relevant to Role 2
}
class Bar {
val baz = new Baz()
}
class Bat {
val baz = new Baz()
}
//Relevant to both Role 1 and 2 (via Bar or Bat)
class Baz {
val bin = new Bin() //Only relevant to Role 1
val buz = new Buz() //Only relevant to Role 2
}
class Bin{}
class Buz{}
可以很容易地看到如何在一个限制访问单班使用性状:
trait FooInRole1 { def bar : Bar } //Define accessor in trait
s/Foo/Foo extends FooInRole1/ //Change Foo's declaration to implement trait
val f : FooInRole1 = new Foo //LHS is i'face, RHS is implementation
//f.bat <--Compile error Irrelevant field is not available. \o/
但你不得不重复这种模式的每个对象相关的使用 - 案件。 (例如,你需要一个BazInRole1
访问bin
和BazInRole2
访问biz
)
我的问题是,是否有一些方法来避免编写所有这些易于获得,错,命名空间拥挤特征。举例来说,我能想象这样的事情代码(不编译):
class Foo[T] {
T match {
case r1 : Role1 => def bar : Bar[T]
case r2 : Role2 => def bat : Bat[T]
case _ => //Nothing
}
}
val fInRole1 = new Foo[Role1] //Provides Foo->Bar->Baz->Bin
val fInRole2 = new Foo[Role2] //Provides Foo->Bat->Baz->Buz
好像Scala的类型系统是足够的表现做这样的事情,但我不能弄明白。
我认为类似这样的事情可以通过类型来实现。只需将类型类视为对象图上的视图,并仅通过类型类来访问和操作其内容。 – ziggystar 2012-02-23 09:54:04