加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala可以约束对象图,以便只显示与上下文相关的那些对象吗?

发布时间:2020-12-16 18:29:34 所属栏目:安全 来源:网络整理
导读:有没有办法使用 Scala的类型系统来简明地指定完整对象图的上下文相关子图? DCI认为你经常有一个相当复杂的对象图,但在任何一个用例中你通常只想使用一个子图.你有一个有棒和蝙蝠的Foo,但是当你处于用例1时,你只关心Bar,而在使用案例2时,只关注蝙蝠. 例如,假
有没有办法使用 Scala的类型系统来简明地指定完整对象图的上下文相关子图?

DCI认为你经常有一个相当复杂的对象图,但在任何一个用例中你通常只想使用一个子图.你有一个有棒和蝙蝠的Foo,但是当你处于用例1时,你只关心Bar,而在使用案例2时,只关注蝙蝠.

例如,假设你有这种结构,并且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的类型系统足以表达这样的事情,但我无法弄明白.

解决方法

不是非常简洁,成员在那里,只是不可能使用,但也许朝着这个方向是可以接受的?

class Foo[R] {
  def bar(implicit ev: R <:< Role1) = new Bar[R] //Only relevant to Role 1
  def bat(implicit ev: R <:< Role2) = new Bat[R] //Only relevant to Role 2
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读