2016-10-21 59 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代码的确切含​​义。

它看起来很大的程序,但它不会花费太多时间。让它理解你自己,而不是解释某人。

相关问题