2017-02-18 5 views
0

少なくとも1つの特定の特性を実装するためにケースクラスを必要としたいと思います。特定の特性を必要とする - >セルフタイプ注釈?

私は、私はこのような自己型注釈を使用することができ、考えた:

case class DisqualifiedDate(override val paths: Set[DatePath], 
    override val cal: Calendar) extends CalendricDate(paths,cal){ 

    this: DateError => 

    val stringPrefix = "DisqualifiedDate" 
} 

sealed trait DateError 
trait Circular extends DateError 
trait Contradictory extends DateError 
trait Inaccessible extends DateError 

しかしミックスインをインスタンス化すると、コンパイルされません。だから、私がするとき:

val date = new DisqualifiedDate(Set(datePath),cal) with Circular 

これはコンパイルされません。

私は何か間違っているのですか、これは全体的なアプローチに欠陥がありますか?

解決済み:正常なクラス、つまり非ケースクラスで完全に機能します。私はなぜこれがそうであるか分からないが、私はそれで大丈夫だ。

+0

セルフタイプの具象クラスがそれを実装しなければならないことを意味します。あなたはDisqualifiedDateを後で延長するつもりでしたか?意図/延長に関する言い訳は意図的ではありませんでした。 –

+0

DisqualifiedDateに少なくとも1つのタイプのDateErrorも含まれていることを確認します。入力が機能しないので、何か間違っているはずです。 DateErrorはここで正確に何が起きたのかを示す必要があります。 DisqualifiedDateに複数のタイプのエラーが発生する可能性があります。私はDisqualifiedDate自体を拡張したくありません。 –

+0

おそらくあなたは何か間違っているし、アプローチに欠陥があります。 "bear"という型のDateErrorは、その情報が型または用語(つまり、どのDateErrorを示すメンバ)としてエンコードされていることを意味します。セルフタイプとは、CircularなどのDisqualifiedDateを持っていることを意味します。 –

答えて

1

スタンドアロンのケースクラス(すなわち、extendsまたはミックスインなし)は、自己入力することはできません。

考えてみてください。 case classは、クラス定義とシングルトンインスタンス化の両方です。自己型参照とは、指定された自己型が混在していない状態でインスタンス化できないことを意味します。

自動シングルトンを作成せずにクラス定義にするか、クラスが定義されています。

class DisqualifiedDate(override val paths: Set[DatePath], 
         override val cal: Calendar 
        ) extends CalendricDate(paths,cal) { 
    this: DateError => 
    . . . 

それとも...

case class DisqualifiedDate(override val paths: Set[DatePath], 
          override val cal: Calendar 
          ) extends CalendricDate(paths,cal) with DateError { 
    this: DateError => // now redundant 
    . . . 
+0

あなたの解決策は正しいと思われ、最初のやり方は自分が望むものです。私は毎回ミックスインをしなければならないことを知っていました。それはまさに私が望んでいたものです。しかし、ケースクラスでは動作しません。 –

関連する問題