案例类和伴随对象

问题描述 投票:3回答:1

我在正确理解类及其伴随对象的使用方面存在问题。

定义一个case类时,它附带了它的伴随对象,但是定义一个与case类同名的对象的结果是什么?它是否覆盖了伴侣对象?以及如何访问案例类参数?

例如,在TestCaseClass.scala文件中,我定义了以下内容:

case class TestCaseClass(att1: String, att2: Int, att4s: List[String])

object TestCaseClass {

  def iWantDoSomethingWithMyParams: String = {
    att1 + " " + att2
  }

  // Other functions
}

object AnotherTestCaseClass {

  def iWantDoSomethingWithTestCaseClassParams: String = {
  // How to access TestCaseClass.att1
    TestCaseClass.att1 + " " + TestCaseClass.att2
  }

  def iWantGetAllAttr4: List[String] = {
     // ???
  }
}
scala
1个回答
6
投票

在某种程度上,给objectclass(或trait)同名只是一个惯例问题。但它也有一些特殊的含义。

伴随对象是一个单独的类,就像任何其他对象一样。如果您希望伴随对象中的方法与类的实例进行交互,则必须像在任何其他情况下一样传递该类的实例。所以,要修复你的第一个例子:

case class TestCaseClass(att1: String, att2: Int, att4s: List[String])

object TestCaseClass {    
  def iWantDoSomethingWithMyParams(x: TestCaseClass): String =
    x.att1 + " " + x.att2
}

类和对象不会以任何方式“覆盖”或踩到彼此的脚趾,因为类和对象属于不同的命名空间。类名称在类型级别(以及构造函数调用)中使用,对象名称在术语级别使用。

类及其伴侣之间存在一些关系:

  • 它确实会影响implicits的解析方式 - 类的伴随对象中定义的任何隐含都会自动进入范围。
  • 该类的private成员对该对象可见,反之亦然。
  • 案例类有点不同,因为case class实际上是一种速记,除了定义一个类之外,还将applyunapply方法添加到其伴随对象中。
© www.soinside.com 2019 - 2024. All rights reserved.