组合子类实现类型限制
Composing subclasses to achieve type restriction
我是 Scala 的新手,正在学习用它编写个人项目。
我遇到了这个问题,环顾四周并没有多大帮助。所以在这里 -
abstract class Service{
def containsFeatures(x: Feature*) = ???
}
object Service1 extends Service{..
def containsFeature(x: Feature*)
}
object Service2 extends Service{..
def containsFeature(x: Feature*)
}
Trait Feature
case object A extends Feature
case object B extends Feature
case object C extends Feature
case object D extends Feature
case object E extends Feature
case object F extends Feature
case object G extends Feature
我想以 Service1 定义哪些功能是可能的,哪些是错误的方式来限制我的代码。
例如:
Service1 允许组合对象 A、C、E、G,并在提供其他功能时显示错误。
是否可以通过我们定义的 Service1 以编程方式限制它而不修改其他 类?
希望我的问题够清楚了。
感谢您的任何建议。
如果您希望 scalac 在提供错误的 Feature
时在编译时显示错误,并且您不能更改 Service1
以外的任何内容,那么这是不可能的。编译器根据其接口接受或拒绝对 Service1.containsFeature
的调用,但其接口已在 Service
中定义,其中表示它将接受 any Feature
.
如果您可以更改其他代码,有一些方法可以做到这一点。例如,如果您可以更改所有内容:
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class Service[Allowed <: Feature] {
def containsFeatures(x: Allowed*): Unit
}
object Service1 extends Service[S1Feature] {
def containsFeatures(x: S1Feature*): Unit = println("ok")
}
object Service2 extends Service[S2Feature] {
def containsFeatures(x: S2Feature*): Unit = println("ok")
}
sealed trait Feature
sealed trait S1Feature extends Feature
sealed trait S2Feature extends Feature
case object A extends S1Feature
case object B extends S2Feature
case object C extends S1Feature
case object D extends S2Feature
case object E extends S1Feature
case object F extends S2Feature
case object G extends S1Feature
// Exiting paste mode, now interpreting.
scala> Service1.containsFeatures(A,B,C)
<console>:16: error: type mismatch;
found : B.type
required: S1Feature
Service1.containsFeatures(A,B,C)
^
scala> Service1.containsFeatures(A,C,G)
ok
我是 Scala 的新手,正在学习用它编写个人项目。
我遇到了这个问题,环顾四周并没有多大帮助。所以在这里 -
abstract class Service{
def containsFeatures(x: Feature*) = ???
}
object Service1 extends Service{..
def containsFeature(x: Feature*)
}
object Service2 extends Service{..
def containsFeature(x: Feature*)
}
Trait Feature
case object A extends Feature
case object B extends Feature
case object C extends Feature
case object D extends Feature
case object E extends Feature
case object F extends Feature
case object G extends Feature
我想以 Service1 定义哪些功能是可能的,哪些是错误的方式来限制我的代码。 例如: Service1 允许组合对象 A、C、E、G,并在提供其他功能时显示错误。
是否可以通过我们定义的 Service1 以编程方式限制它而不修改其他 类?
希望我的问题够清楚了。
感谢您的任何建议。
如果您希望 scalac 在提供错误的 Feature
时在编译时显示错误,并且您不能更改 Service1
以外的任何内容,那么这是不可能的。编译器根据其接口接受或拒绝对 Service1.containsFeature
的调用,但其接口已在 Service
中定义,其中表示它将接受 any Feature
.
如果您可以更改其他代码,有一些方法可以做到这一点。例如,如果您可以更改所有内容:
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class Service[Allowed <: Feature] {
def containsFeatures(x: Allowed*): Unit
}
object Service1 extends Service[S1Feature] {
def containsFeatures(x: S1Feature*): Unit = println("ok")
}
object Service2 extends Service[S2Feature] {
def containsFeatures(x: S2Feature*): Unit = println("ok")
}
sealed trait Feature
sealed trait S1Feature extends Feature
sealed trait S2Feature extends Feature
case object A extends S1Feature
case object B extends S2Feature
case object C extends S1Feature
case object D extends S2Feature
case object E extends S1Feature
case object F extends S2Feature
case object G extends S1Feature
// Exiting paste mode, now interpreting.
scala> Service1.containsFeatures(A,B,C)
<console>:16: error: type mismatch;
found : B.type
required: S1Feature
Service1.containsFeatures(A,B,C)
^
scala> Service1.containsFeatures(A,C,G)
ok