Scala学习笔记(12)-特质、包和引用

1.特质:trait是Scala里代码复用的基础单元。特质封装了方法和字段的定义,并能够经过混入到类中重用它们。不像类的继承那样,每一个类都只能继承惟一的超类,类能够混入任意个特质。一旦特质被定义了,就能够使用extends或with关键字,把它混入到类中。Scala程序员“混入”特质而不是继承它们,由于特质的混入与那些其它语言中的多继承有重要的差异。 程序员

特质就像是带有具体方法的Java接口,不过其实它能作的更多。特质能够,比方说,声明字段和维持状态值。实际上,你能够用特质定义作任何用类定义作的事,而且语法也是同样的,除了两点。第一点,特质不能有任何“类”参数,也就是说,传递给类的主构造器的参数。换句话说,尽管你能够定义以下的类:  ui

class Point(x: Int, y: Int)
可是下面定义特质的尝试将遭到失败:
trait NoPoint(x: Int, y: Int) // 编译不过

类和特质的另外一个差异在于不论在类的哪一个角落,super调用都是静态绑定的,在特质中,它们是动态绑定的。 scala

2.包 code

Scala里把代码放在包里的另外一种方式很像C#的命名空间。在package子句以后用大括号包起来一段要放到包里去的定义。除此以外,这种语法还能让你把文件的不一样部分放在不一样的包里。 对象

package bobsrockets.navigation {
    // 在bobsrockets.navigation包里
    class Navigator package tests {
        // 在bobsrockets.navigation.tests包里 class NavigatorSuite
    }
}

正如注释所提示的,Scala的包的确是嵌套的。也就是说,包navigation从语义上在包bobsrockets内部。Java包,尽管是分级的,却不是嵌套的。在Java里,在你命名一个包的时候,你必须从包层级的根开始。Scala为了简化语言使用了更严谨的规则。 继承

3.引用 索引

// 易于访问bobsdelights的全部成员 接口

import bobsdelights._

Scala的按需引用写做尾下划线(_)而不是星号(*)(毕竟*是合法的Scala标识符! it

Scala引用能够出如今任何地方,而不是仅仅在编译单元的开始处。一样,它们能够指向任意值。例如: io

def showFruit(fruit: Fruit) {
    import fruit._
    println(name +"s are "+ color)//这里的两个索引等价于fruit.name和fruit.color
}

Scala的引用一样能够重命名或隐藏成员。能够用跟在引用的成员对象以后的包含在括号里的引用选择子句:import selector clause作到。下面是一些例子:

import Fruits.{Apple, Orange}

此次只引用了对象Fruits的Apple和Orange成员。

import Fruits.{Apple => McIntosh, Orange}

此次从对象Fruits引用了Apple和Orange两个成员。不过,Apple对象重命名为McIntosh。所以这个对象能够用Fruits.Apple或McIntosh访问。重命名子句的格式是“<原始名> => <新名>”。

import Fruits.{_}

这个引用了对象Fruits的全部成员。这与import Fruits._同义。

import Fruits.{Apple => McIntosh, _}

这个从Fruits对象引用全部成员,不太重命名Apple为McIntosh。

import Fruits.{Pear => _, _}

这个引用了除Pear以外的全部Fruits成员。“<原始名> => _”格式的子句从被引用的名字中排除了<原始名>。某种意义上来讲,把某样东西重命名为‘_’就是表示把它隐藏掉。

总而言之,引用选择能够包括下列模式:
 简单名x。把x包含进引用名集。
 重命名子句x => y。让名为x的成员以名称y出现。
 隐藏子句x => _。把x排除在引用名集以外。
 全包括‘_’。引用除了前面子句提到的以外的全体成员。若是存在全包括,那么必须是引用选择的最后一个。

4.私有成员

class Outer {
    class Inner {
        private def f() {
        println("f")
        }
        class InnerMost {
            f() // OK
        }
    }
    (new Inner).f() // 错误:f不可访问
}

Scala里,(new Inner).f()访问非法,由于f在Inner中被声明为private而访问不在类Inner以内。相反,类InnerMost里访问f没有问题,由于这个访问包含在Inner类以内。Java会容许这两种访问由于它容许外部类访问其内部类的私有成员。

Scala里的访问修饰符能够经过使用修饰词增长。格式为private[X]或protected[X]的修饰符表示“直到”X的私有或保护,这里X指代某些外围的包,类或单例对象。

5.伴生对象

在Scala里没有静态成员;代之以能够拥有包含成员的仅存在一个的伴生对象。

Scala的访问规则给予了伴生对象和类一些特权。类把它全部的访问权限共享给半生对象,反过来也是如此。特别的是,对象能够访问全部它的伴生类的私有成员,就好象类也能够访问全部伴生对象的私有成员同样。

相关文章
相关标签/搜索