scala自体のタイプのself-typeの役割


self type作用は、通常、大きなクラスから複数の特質tritsまでを分割するためのものです。例えばcake patternケーキのモードでself typeを使います。
公式サイトの説明は以下の通りです。
http://docs.scala-lang.org/glossary/#self-type
 
 
self type
A self type of a trit is the asumed type of  this、the receiver、to be used within the trotit.Any concrete class that mixes in the trit must ensure that type conforms to the trit’s self type.The most common of self types for dividivideng lapte Prograamming in Scal.
 
 
 
 
 
第29章第4小節で与えられた例コードは以下の通りである。
 
 
 
29.4 Spliting modules イント trits
 
package quickanswer.chapter 10
 
クラス Food(fn:String){
  var name:String=fn
)
 
クラス Recipe(var rn:String,var foodLst:List[Food],var desc:String){/レシピ
 
)
 
トラック FoodCategories {
  case クラス FoodCategory(name: String foods: List[Food]
  def all Categories: List[FoodCategory]
)
 
 
トラック SimpleFoods {
  object Pear extens Food(「Pear」)
  object Apple extens Food(「Apple」)
  def all Foods = List(Apple) Pear)
  def all Categories = Nil
)
 
abstract クラス Database extens FoodCategories {
  def all Foods: List[Food]
  def allRecipes: List[Recipe]
  def food Named(name: String) =
  all Foods.find(f => f.name == name
)
 
object SimpleDatabase extens Database with SimpleFoods with SimpleRecipes
 
トラック SimpleRecipes { // Des not comple
 // this: SimpleFoods =>   //
この文は間違いをコンパイルします。
Apple、 PearはSimpleFoodsで定義されています。
  object Fuit Salad extens Recipe(
  「fuit」 salad「
  List(Apple) Pear) // Uh。 oh
  Mix it all. together."
  )
  def allRecipes = List(Fuit Salad)
)
 
 
object Spliting Modules IntoTraits extens アプリ {
 
)
 
コード解釈
 
 
dividing a large class SimpleDatabase ) into several trits  (SimpleFoods,SimpleRecipes)ではtritを定義しています。 SimpleRecipes の中にはSimpleFoodsの内容が必要ですが、コンパイラは分かりません。  SimpleRecipesはSimpleFoodsに混入しています。 にしても Apple、 PearはSimpleFoodsで定義されていますので、コンパイルは間違いがあります。 ,    self typeを通じてこの問題を解決しました。
 
技術的には、self typeはthisタイプの仮定を表すタイプです。プログラミングの観点から言えば、self type 特定のクラスに指定された特性を混ぜないとコンパイルエラーが発生します。他のtritにTritが混入していた場合、他のtritは想定されたタイプのself typeが必要です。
 
SimpleRecipesを追加すると this: SimpleFoods =>   その後、Pearは密かにthis.Pearに転化されます。これは安全です。SimpleRecipesに混入した具体的な種類は、SimpleFoodsにも混入しなければなりません。 。これはPearがこの具体的なタイプのメンバーになるという意味です。SimpleRecipesに混入した抽象的なクラスとtritはないですよ。この制限は、newでは実現できません。所よthis.Pearは安全です。
 
 
 
本は次のように解釈します
 
The proble here is that Pear is located in a. ディfferent トラック from the one that
アメリカ it そ it is out 保存先 scope. The compler ハイ no。 idea that SimpleRecipes
is only ever mixed together with SimpleFoods.
The e e is a. way あなた can ホテル this ト the commpiler、 ホワイバー. Scara プロヴィデンス
the self タイプ for precisely this シンプル. Technicaly a. self タイプ is an クラスメイト
タイプ for this whenever this is mentiond within the クラス. Pragmaticaly、
a. self タイプ specifees the requirements オン any concrete クラス the トラック is mixed
into. If。 あなた すばらしい a. トラック that is only ever アメリカ語 when mixed in with another
トラック or trits、 then あなた can specify that those other trits ショルダー be asumed.
In the present case it is enough ト specify a. self タイプ 保存先 SimpleFoods as
ショー?ショー in Listing 29.15:
 
トラック SimpleRecipes {
this: SimpleFoods =>
object Fuit Salad extens Recipe(
「fuit」 salad「
List(Apple) Pear) // ナウ Pear is in scope
Mix it all. together."
)
def allRecipes = List(Fuit Salad)
)
Listing 29.15 · A SimpleRecipes トラック with a. self タイプ.
 
Given the new self タイプ Pear is now available. Implicitly the reference
ト Pear is thought 保存先 as this.Pear. This is safe、 because any concrete
クラス that mixes in SimpleRecipes must also be a. subtype 保存先 SimpleFoods
which means that Pear will be a. メンバー Abstract subclases and trits ド
not すばらしい ト フォロワー this restication but シンプル they cannot be instantiated with
new there is no。 rik that the this.Pear reference will fail