簡體   English   中英

組成子類以實現類型限制

[英]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的定義以編程方式限制它,而無需修改其他類?

我希望我的問題很清楚。

感謝您的任何建議。

如果要在提供錯誤的Feature時使scalac在編譯時顯示錯誤,並且您不能更改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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM