Scala 中的包
Scala 中的包是一种封装一组类、子包、特征和包对象的机制。它基本上提供了命名空间来将我们的代码放在不同的文件和目录中。包是维护我们的代码的一种简单方法,它可以防止不同包成员的命名冲突。为包的成员提供访问控制,如私有、受保护、包特定的控制范围,限制了成员对其他包的访问,而没有修饰符的成员可以在任何其他包中使用,并有一些参考。
包装声明
包被声明为 Scala 文件顶部的第一条语句。
句法 :
package package_name
// Scala classes
// traits
// objects..
可以通过不同的方式定义一个包:-
- 链式方法
package x.y.z // members of z
或可用作:-
package x package y package z // member of z
- 嵌套包
package x{ // members of x {as required} package y{ // members of y{as required} package z{ // members of z{as required} } } }
包的工作原理
包将数据绑定在一个文件中或用作数据封装,当保存文件时,它位于默认包或文件顶部指定的包名称下。包名和目录结构密切相关。例如,如果包名是college.student.cse,那么将有3 个目录,college、student 和cse。这样 cse 存在于学生中,而学生存在于大学中。
college
+student
+cse
这个想法是确保文件在使用包时很容易在目录中找到。
域名的包命名约定顺序相反,即 org.geeksforgeeks.practice、org.geeksforgeeks.contribute。
将成员添加到包
我们可以在包中添加任意数量的成员,例如类、子类、特征、包含主方法的对象和子包。与Java包不同,我们可以在不同的 scala 文件中添加声明的包,即可以为同一个包编写不同的 scala 文件。
例子:
// file named as faculty.scala
package college
class faculty{
def faculymethod(){}
}
// file named as student.scala
// containing the main method
// using the college package name again
package college
class student
{
def studentmethod(){}
}
// Creating object
object Main
{
// Main method
def main(args: Array[String])
{
val stu= new student()
val fac= new faculty()
// faculty class can be accessed while
// in different file but in same package.
}
}
目录结构中实际创建的内容如下:-
college
+faculty.scala
+student.scala
使用包
包可以在程序中以不同的方式使用。导入子句在 Scala 中比在Java中非常灵活。比如 import 子句可以在程序中的任何地方使用关键字import作为程序中的独立语句使用, Java不允许这样做。
// base.scala
// bb directory
package bb
// creating a class
class geek
{
private var id=0
def method()
{
println("welcome to geek class")
println("id="+id)
}
}
以下是使用 import 子句的 Package 示例。
// main.scala
// aa directory
package aa
// Creating object
object Main
{
// Main method
def main(args: Array[String])
{
// importing in main method
import bb.geek
// using the member injected using import statement
val obj = new geek()
obj.method();
}
}
使用 import 语句的不同方法
- 导入包的所有公共成员。
import college._ //imports all college members students, faculties, houseKeeping etc.
- 仅导入包的选定成员。
import college.{faculty, houseKeeping} //member student is not selected hence cannot be used in current file
- 导入并重命名成员。
import college.{student => stu} //stu is used in-place of student