亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自我類型和特質子類之間有什么區別?

自我類型和特質子類之間有什么區別?

自我類型和特質子類之間有什么區別?特征的自我類型A:trait Btrait A { this: B => }說"A不能混合到不擴展的具體類中。B".另一方面,以下方面:trait Btrait A extends B說“任何(具體或抽象的)類混合A也將混合在B中“.這兩句話的意思不是一樣嗎?自我類型似乎只會造成簡單編譯時錯誤的可能性。我遺漏了什么?
查看完整描述

3 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

它主要用于依賴注入,比如蛋糕的圖案。有一個偉大文章涵蓋Scala中許多不同形式的依賴注入,包括Cake模式。如果你谷歌“蛋糕模式和Scala”,你會得到許多鏈接,包括演示文稿和視頻。現在,這里有一個鏈接到另一個問題.

現在,關于自我類型和擴展特性之間的區別,這很簡單。如果你說B extends A,然后B A..當你使用自我類型時,B 要求A..有兩個特定的需求是用自我類型創建的:

  1. 如果

    B

    是擴展的,那么你.

    所需

    混入

    A.

  2. 當一個具體的類最終擴展/混合-在這些特征中,一些類/特征必須實現

    A.

考慮以下例子:

scala> trait User { def name: String }defined trait Userscala> trait Tweeter {
     |   user: User =>
     |   def tweet(msg: String) = println(s"$name: $msg")
     | }defined trait Tweeterscala> trait Wrong extends Tweeter {
     |   def noCanDo = name     | }<console>:9: error: illegal inheritance;
 self-type Wrong does not conform to Tweeter's selftype Tweeter with User
       trait Wrong extends Tweeter {
                           ^<console>:10: error: not found: value name         def noCanDo = name                       ^

如果Tweeter的子類User,就不會有錯誤。在上面的代碼中,我們所需 a User什么時候都行Tweeter使用,但是User沒有提供給Wrong所以我們發現了一個錯誤?,F在,考慮到上面的代碼仍然在范圍內,請考慮:

scala> trait DummyUser extends User {
     |   override def name: String = "foo"
     | }defined trait DummyUserscala> trait Right extends Tweeter with User {
     |   val canDo = name     | }defined trait Right scala> trait RightAgain extends Tweeter with DummyUser {
     |   val canDo = name     | }defined trait RightAgain

帶著Right,混合的要求User很滿意。然而,上述第二項要求沒有得到滿足:執行的負擔。User仍然存在于擴展的類/特性中Right.

帶著RightAgain這兩項要求都得到滿足。一個User的實施User提供。

關于更實際的用例,請參閱這個答案開頭的鏈接!但希望你現在明白了。


查看完整回答
反對 回復 2019-07-04
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

Self類型允許您定義周期性依賴項。例如,您可以實現以下目標:

trait A { self: B => }trait B { self: A => }

繼承使用extends不允許那樣做。試著:

trait A extends Btrait B extends A
error:  illegal cyclic reference involving trait A

在Odersky書中,請參閱第33.5節(創建電子表格UI章節),其中提到:

在電子表格示例中,類模型繼承了計算器,從而獲得了對其計算方法的訪問權。另一方面,類評估器將其Self類型定義為模型,如下所示:

package org.stairwaybook.scellstrait Evaluator { this: Model => ...

希望這能幫上忙。


查看完整回答
反對 回復 2019-07-04
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

另一個不同之處是,自類型可以指定非類型。例如

trait Foo{
   this: { def close:Unit} => 
   ...}

這里的Self類型是一種結構類型。其效果是說,在foo中混合的任何東西都必須實現一個no-arg“Close”方法返回單元。這允許安全的混合鴨類型.


查看完整回答
反對 回復 2019-07-04
  • 3 回答
  • 0 關注
  • 515 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號