组成子类以实现类型限制

问题描述 投票:0回答:1

我是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定义以编程方式限制它而不修改其他类?

我希望我的问题很清楚。

谢谢你的任何建议。

scala subclass type-resolution
1个回答
0
投票

如果你希望scalac在编译时显示错误,当提供错误的Feature时,你不能改变除Service1之外的任何东西,那么它是不可能的。编译器根据其接口接受或拒绝对Service1.containsFeature的调用,但是它的接口已在Service中定义,它表示它将接受任何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
© www.soinside.com 2019 - 2024. All rights reserved.