📜  Scala 中的包

📅  最后修改于: 2022-05-13 01:54:26.792000             🧑  作者: Mango

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