2017-01-17 6 views
0

私はScalaには新しく、その中に個人プロジェクトをコーディングすることを学んでいます。サブタイプを作成して型制限を実現する

私はこの問題を抱えていて、周りを見回してもあまり役に立ちませんでした。だから -

私はService1がどの機能が可能で誤っているかを定義するようにコードを制限したいと思います。 例: Service1はオブジェクトA、C、E、Gを合成することができ、他の機能が提供されている場合はエラーを表示します。

他のクラスを変更せずにService1の定義だけでこれをプログラムで制限できますか?

私の質問がはっきりしていることを願っています。

ありがとうございます。

+0

このようなことをしたいですか? Service1.containsFeature(List(A、C、E、G))// OK Service1.containsFeature(List(B、D、F))//エラーをスローする –

+0

コンパイル時にエラーが表示されるはずです。右? –

+0

はい、コンパイル時にエラーが発生しました。 – Adarsh

答えて

1

Featureが間違っているときにscalacにエラーを表示させ、Service1以外を変更することはできません。コンパイラはそのインターフェイスに基づいてService1.containsFeatureへの呼び出しを受け入れるか拒否しますが、そのインターフェイスは既にServiceに定義されており、のいずれかを受け入れます。 を受け入れます。

他のコードについて変更することができる場合は、いくつかの方法があります。たとえば、すべてを変更できる場合:

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 
+0

シグネチャを変更する場合は、これらのコンポジションを定義し、メソッドシグネチャを適切なサブクラスに更新するために、Featureのサブクラスを定義する方法があります。 – Adarsh

+0

@Adarsh私は自分の答えを編集しました。 –

+0

更新いただきありがとうございます。この使用パターンを見るのは面白いです。しかし、Service1型のオブジェクトをService型のメソッドに渡そうとするとコンパイラチェックが行われるようになりました。私はこれがこのアプローチのトレードオフだと思いますか? – Adarsh

関連する問題