2016-10-21 41 views
-2

我理解我現有的項目,幾件事情我無法理解:在Scala中,「case class extends trait」是什麼意思?

trait PeriodA { 
    def start: Long 
    def stop: Long 
    def description: String 
    def manageTo: String 
} 

case class PeriodEntity(
    start: Long, 
    stop: Long, 
    description: String, 
    manageTo: String) 
    extends PeriodA 

能否請您解釋一下這裏發生了什麼?

+1

您是否有其他面嚮對象語言的經驗,如Java,C++,...? –

+1

[在Scala中瞭解案例類和特徵]可能的重複(http://stackoverflow.com/questions/22769175/understanding-case-class-and-traits-in-scala) –

+1

嘗試在案例類擴展特徵。有很多非常詳細的答案。 –

回答

4

步驟由步驟:

  • trait PeriodA { - 性狀的定義(這大概是一個接口 - 用於進一步理解,請閱讀spec

  • def start: Long def stop: Long def description: String def manageTo: String - 的定義 '待命' 評價性狀特性。您可以將它們視爲Java getFieldName函數。

  • case class PeriodEntity'case class'的定義比稍微複雜一點。簡而言之,該定義使編譯器隱式地將val前綴添加到定義的每個所謂的「元素」(字段)。它還使用apply/unapply函數對定義伴隨對象,如果您想要使用模式匹配,它可以派上用場,但這不在當前話題中。 Case classes specification

  • start: Long, stop: Long, description: String, manageTo: String - 定義了構造函數參數和類字段,它們稱爲「元素」。就編譯器隱含地標記具有val前綴的元素而言,它們應該被認爲是不可變的。如前所述,它們可以被視爲獲取訪問者。

  • extends PeriodA - 聲明類PeriodEntity mixins(執行)PeriodA接口。就case類元素被編譯器隱式地視爲val而言,不需要明確地實現或覆蓋抽象方法 - 編譯器會將元素視爲默認實現。
0

謝謝你讓我明白,我想分享我的理解,

trait PreridA - 不過是一個接口有4種get方法。

case class PeriodEntity extends PeriodA - PeriodEntity應該有PeriodA中提到的4個get方法。如果您刪除PeriodEntity中的任何字段,則將收到編譯異常。簡而言之,它就像一個類實現一個接口。

我得到了解決這些類型的誤解。爲此,您應該掌握有關Java的基本知識。

  1. 把你不明白的代碼放到單獨的新Scala類中。
  2. 使其不存在編譯問題。
  3. 如果需要重建項目,那麼它會在目標中創建.class文件。
  4. 使用任何Decompiler jd-GUI或其他。
  5. 或者CD < ..> \目標\斯卡拉2.11 \類 運行

    javap的包。員工

  6. 您將在控制檯中看到java代碼。

只有當您在實時項目上工作時,才需要1,2個步驟,實際的項目代碼包含大量的邏輯。 如果你覺得你可以理解,那麼你可以省略1和2步驟。

那麼,你可以很容易地理解你的Scala代碼的確切含​​義。

它看起來很大的程序,但它不會花費太多時間。讓它理解你自己,而不是解釋某人。

相關問題