包对象
Scala提供包对象作为在整个包中共享的方便容器。
包对象可以包含任意定义,而不仅仅是变量和方法定义。例如,它们经常用于保存包范围类型的别名和隐式转换。包对象甚至可以继承Scala类和特征。
按照惯例,包对象的源代码通常放在一个名为的源文件中package.scala。
每个包都允许有一个包对象。放置在包对象中的任何定义都被视为包本身的成员。
见下面的例子。首先假设包中有一个类Fruit和三个Fruit对象 gardening.fruits:
// in file gardening/fruits/Fruit.scala
package gardening.fruits
case class Fruit(name: String, color: String)
object Apple extends Fruit("Apple", "green")
object Plum extends Fruit("Plum", "blue")
object Banana extends Fruit("Banana", "yellow")
现在假设您要将变量planted和方法showFruit直接放入包中gardening.fruits。这是如何做到的:
// in file gardening/fruits/package.scala
package gardening
package object fruits {
val planted = List(Apple, Plum, Banana)
def showFruit(fruit: Fruit): Unit = {
println(s"${fruit.name}s are ${fruit.color}")
}
}
作为使用网站的外观,下面的对象一个例子PrintPlanted进口planted,并showFruit在它到底进口类的方法相同Fruit,使用上包gardening.fruits通配符导入:
// in file PrintPlanted.scala
import gardening.fruits._
object PrintPlanted {
def main(args: Array[String]): Unit = {
for (fruit <- fruits.planted) {
showFruit(fruit)
}
}
}
包对象与其他对象类似,这意味着您可以使用继承来构建它们。例如,人们可能会混合几个特征:
package object fruits extends FruitAliases with FruitHelpers {
// helpers and variables follows here
}
请注意,方法重载在包对象中不起作用。
网友评论