2017-08-16 14 views
1

の一つが、私はこのような形質を持っていると言う実装する必要があります明らかに形質実装は二つの方法

trait Truthy { 
    def isFalse = !isTrue 
    def isTrue = !isFalse 
} 

、これはトレイトを拡張するクラスがisTrueisFalseそのうちの一つが呼び出される実装していない場合は無限に再帰的になります。

私は、デフォルトの実装せずにisTrueまたはisFalseのどちらかを残すことができるが、その後、私は選択する必要があるだろうし、他の人が自然isFalse 1を持っているかもしれないが、いくつかの実装は非常に自然isTrue実装している場合があります。

拡張クラスに2つの方法のいずれかを実装して、そのうちの1つを優先させる方法はありますか?

+1

私は簡単な方法は、簡単な方法は、最終的なdef isFalse =!isTrue'は、形質の – cchantep

+0

でそれは 'isFalse'の実装を提供することはできませんので、動作しませんサブクラスです。 –

答えて

2

Scalaにこのような制約を適用する方法はありませんが、問題を回避するために複数の特性を使用することができます。例えば:

trait Truthy { 
    def isFalse: Boolean 
    def isTrue: Boolean 
} 

object Truthy { 
    trait DeriveIsFalse { 
    this: Truthy => 

    def isFalse = !isTrue 
    } 

    trait DeriveIsTrue { 
    this: Truthy => 

    def isTrue = !isFalse 
    } 
} 

はその後、としてそれを使用することができます。

class MyImplementation extends Truthy with Truthy.DeriveIsTrue { 
    def isFalse = someMeaningfulImplementation() 
} 

これは方法ですが、複数の特性を使用している場合、他のものは確かにあります。

関連する問題