Scala中的类,对象,特征,密封特征

Arp*_*wal 13 java oop functional-programming scala

我是从OOP背景,并想清楚我的想法有关Object,Classes,Trait,Sealed TraitCase ClassesScala,我写下面有什么.我了解到目前为止:

我们创建Object,当我们想要在其中编写一些实用程序函数时,我们可以直接访问它,而不使用Java中的"new"关键字,如"静态"类.

我们创建Classes,当我们编写动词时意味着一个对象,它的行为封装与我们为Java中的类编码相同,我们使用"new"关键字对其进行实例化.

Trait当我们想要编写与Abstract类相同的代码时,我们创建Java.

Sealed Trait当我们想要在Java中实现与Enum相同的功能时,我们就会创建.

我们创建的Case classes时候可以预期这个类可以在将来用于模式匹配,类似于Java中的instanceOf.

我的理解对所有这些都是正确的吗?

alc*_*arv 19

如果你用OOP眼睛观察它们,你或多或少都对你所陈述的大部分事实都是正确的.但我们对他们有更多.

宾语

Scala中的对象可以从Functional Programming透视图中看作模块.它们的确用于聚合您称为"效用函数"的类似的kinded函数.但它们也有其他含义.

一个object可以被看作是一个单独的对象,因为你可以有一个object继承特定traitclass.

trait Bird
object Duck extends Bird
Run Code Online (Sandbox Code Playgroud)

你也有伴侣对象的概念.这是一个具有与该类相关的模块函数的对象,您甚至可以private从该类中引用该对象的成员.

class Dog {
  def eat(food: Food) = Dog.preferredFoods.contains(food)
}

object Dog {
  private val preferredFoods = List(Ribeye, DogFood, Banana)
  def walk(dog: Dog) = ???
}
Run Code Online (Sandbox Code Playgroud)

你对课程是正确的.它们与Java概念非常接近.

特征

trait在Scala中查看a的一种方法是abstract class.但请注意,您也可以abstract class在Scala中使用与Java相同的行为.那有什么区别?

正如评论中指出的那样,几个traits可以混合在一起.

另外traitS可以看作是一个Java interface如果它是完全抽象的,这是所有方法都是抽象的,与Java的.事实上,如果你的目标是与Java互操作,那就是声明一个interface.

A sealed trait只是告诉编译器除了同一文件中的类之外,不会有任何继承此类的类或其他特征的方法.当你指出案例类时,这就是模式匹配的目的,因此编译器能够通过警告判断模式匹配是否详尽无遗.但也请注意Scala enum.

案例类

案例类可以与a一起使用以sealed trait用于模式匹配.但是a case class更像是一个"价值阶级".这case使得编译器生成了一堆样板代码,因此您不必这样做.

你有一个自动的"伴侣对象",所以你可以new使用自动生成的apply函数实例化没有的对象.

你有自动hashCode,equals,toStringcopy实现.你有val所有构造函数参数的自动s.

scala> case class Room(area: Int)
defined class Room

scala> var r = Room(16)
r: Room = Room(16)

scala> r.hashCode
res2: Int = 1313771839

scala> r == Room(16)
res3: Boolean = true

scala> r == Room(15)
res4: Boolean = false

scala> r.toString
res5: String = Room(16)

scala> r.area
res6: Int = 16

scala> case class Point(x: Int, y: Int)
defined class Point

scala> val p = Point(1, 1)
p: Point = Point(1,1)

scala> val p1 = p.copy(y = 0)
p1: Point = Point(1,0)
Run Code Online (Sandbox Code Playgroud)