了解Scala中的类和对象

19 浏览
0 Comments

了解Scala中的类和对象

我对Scala非常陌生,现在我必须处理一个既包含Scala又包含Java的项目。我遇到了这样一种构造:

class SomeType{
    //...
}
trait Trait1 extends scala.AnyRef{
}
trait Trait2 extends extends scala.AnyRef{
}
class MyClass(arg : SomeType) extends Trait1{
    //...
}
object MyClass extends Trait2{
    //...
}

这令人感觉有些无聊。通过阅读这篇答案,我了解到我们可以将object视为只带有抽象方法的类。也就是说,在Java中我们可以(依我之见)定义一些使用Class对象的映射关系。

但是在这个例子中,classobject继承的是不同的trait。这就是我真正困惑的地方,我无法想象它的含义以及为什么要使用它。

admin 更改状态以发布 2023年5月23日
0
0 Comments

一个类就像其他语言中的任何其他类一样。您可以使用一些语法差异定义类,就像使用其他任何语言一样。此外,有些带有一些方便方法定义的case 类,允许轻松初始化对象。

class Person(val name: String)
val me = new Person("My name")

然而,对象是只有单个对象的类。这使得它非常有趣,因为它可以使用伴随对象创建类的静态成员。此伴随对象可以访问类定义的私有成员,并且与您正在定义的类具有相同的名称。

class Person(var name: String) {
  import Person._
  def hi(): String = sayHello(name)
}
object Person {
  private def sayHello(name: String): String = "Hello " + name
}
val me = new Person("My name")
me.hi()

此外,值得注意的一点是,对象类是惰性创建的,这是另一个重要的点。因此,除非需要在我们的代码中使用它们,否则它们不会被实例化。

如果您正在为JDBC定义连接创建,则可以将它们创建在对象内部,以避免重复,就像我们在Java中使用单例对象一样。

0
0 Comments

我会试着从一个了解Java的人的角度来解释Scala的object是什么。

在Java中,您可以定义“普通”类成员和static类成员。当Java中的某些东西(例如成员变量)是static时,那么只有一个该成员变量的实例,该实例被该类的所有实例共享。

在Scala中,没有static。与Java相比:您在Java中要使static的任何内容,在Scala中都可以放入一个object中。

Scala object是单例的 - 只有一个实例,就像只有一个static成员的Java一样。

希望这使得Scala object是什么变得更加清晰。

Scala object可以像任何其他类或trait一样扩展类或trait,这样它就会继承在它扩展的类或trait中定义的任何内容。真的没有理由不能这样做。

请注意,如果您拥有一个具有相同名称的,则这两个属于一起 - 它们可以查看对方的私有成员。 object被称为类的伴随对象

请注意,这并不意味着object是类的实例。它不是 - 它是一个独立的东西,站在类的旁边。也许您对类和对象扩展不同traits的困惑来自于这个观点的误解。

0