[转帖]Scala学习笔记(九) - 包和引用_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2760 | 回复: 0   主题: [转帖]Scala学习笔记(九) - 包和引用        下一篇 
jie.liang
注册用户
等级:少校
经验:1003
发帖:77
精华:0
注册:2013-10-11
状态:离线
发送短消息息给jie.liang 加好友    发送短消息息给jie.liang 发消息
发表于: IP:您无权察看 2013-10-22 9:13:26 | [全部帖] [楼主帖] 楼主

Scala中的包和引用感觉上是集合了C#,Java和VB三种的基础上又进行了强化,所以看上去相当的强大与灵活,当然灵活的代价就是掌握起来会有一些复杂。

首先是Scala中的包可以像Java一样使用,例如:

package com.my.io
class XXX


因为Scala并不要求一个文件对应一个类,所以这种写法会把这个文件中的所有类都划给这个包。

同样,因为Scala不要求文件夹的嵌套,所以,你可以像C#那样随便把文件丢哪,然后增加package语句。

当然,你可以像C#的namespace一样使用package语句,例如:

package com.mu.io{
      class XXX
}


package是也可以嵌套的,例如:

package com.my.io{
      class XXX
      package test{
            class T
      }
}


则类型T的完整路径为: com.mu.io.test.T

很多时候,大家如果定义了嵌套的包,但是包名有冲突的时候,可以使用 _root_来写完成的路径,_root_ 类似于C#中的 global:: 的意思

=====引用==========

Scala中依然使用import作为引用包的关键字,例如:

import com.my.io.XXX   // 可以不写XXX的全路径
import com.my.io._       // 引用import com.my.io下的所有类型
import com.my.io.XXX._  //引用import com.my.io.XXX的所有成员


而且Scala中的import可以写在任意地方,这样可以通过外层的作用范围减少引用的范围,例如:

def method(fruit : Fruit){
      import fruit ._
      println(name)
}


本来name是Fruit的一个成员,现在通过在函数中使用 import fruit ._ 来简化name的编码,这点与VB很像

同时,import语句可以给类型重命名,例如:

import com.my.io.{XXX => HHH}


这样直接使用HHH来代替XXX

也可以一次引用多个,例如:

import com.my.io.{XXX , YYY}


更神奇的是,你可以引用一整个包,同时将一些不需要的名称剔除,例如:

import com.my.io.{XXX => _, _} 这句话是引用com.my.io包下除了XXX以外的所有的类型

==访问修饰符=============

Scala中的访问修饰符只有private,与protected两个,这两个含义与Java/C#中一致,但是这两个可以进行各种组合,例如:

[java]

  1. package bobsrockets { 
  2.        package navigation { 
  3.              private[bobsrockets] class Navigator { 
  4.              protected[navigation] def useStarChart() {} 
  5.                    class LegOfJourney { 
  6.                          private[Navigator] val distance = 100 
  7.                    } 
  8.                    private[this] var speed = 200 
  9.              } 
  10.        } 
  11.        package launch { 
  12.              import navigation._ 
  13.              object Vehicle { 
  14.                    private[launch] val guide = new Navigator 
  15.              } 
  16.        } 



很强大吧。。。╮(╯▽╰)╭

现在如果将这些组合应用到 LegOfJourney.distance上,会有什么样的效果,

private[bobsrockets]:可以在外部包中访问(命名空间内可见)

protected[navigation]:与Java的包可见度相同(包内可见)

private[Navigator] : 与Java的private相同(类内可见)

private[LegOfJourney]:与Scala中的private相同(本类中可见,父类中不可见)

private[this] :只有同一个对象中可见

即便在 Navigator类中使用以下代码也会出错

val other = new Navigator
other.speed // 编译错误


只能是 this.speed 使用。

嘛,个人感觉应该用不到这么复杂的访问修饰符吧。。。大概。。。

======================================

Scala中面向对象的以及传统的介绍就到这里了,后面将会介绍Scala中比较特殊的东西,例如函数的柯里化,伴生对象等




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论