无标题文章

2017-07-24  本文已影响0人  huadianhuanglei

什么时候应该使用特质而不是抽象类?

如果你想定义一个类似接口的类型,你可能会在特质和抽象类之间难以取舍。这两种形式都可以让你定义一个类型的一些行为,并要求继承者定义一些其他行为。一些经验法则:

优先使用特质。一个类扩展多个特质是很方便的,但却只能扩展一个抽象类。

如果你需要构造函数参数,使用抽象类。因为抽象类可以定义带参数的构造函数,而特质不行。例如,你不能说trait t(i: Int) {},参数i是非法的。

你不是问这个问题的第一人。可以查看更全面的答案:stackoverflow: Scala特质vs抽象类,抽象类和特质的区别,andScala编程:用特质,还是不用特质?

最大化当前视图或编辑器:Ctrl+M

只有在需要函数类型的地方,Scala才允许你省略这个仅有的_

堆栈

允许客户向函数传入可变长度参数列表。想要标注一个重复参数,可在参数的类型之后放一个星号

def echo(args:String*)=for(arg<-args)

println(arg)

echo(arr:_*)_*这个标注告诉编译器把arr的每一个元素当作参数,而不是当作单一的参数传给echo

object

在scala中没有静态方法和静态字段,所以在scala中可以用object来实现这些功能,直接用对象名调用的方法都是采用这种实现方式,例如Array.toString。对象的构造器在第一次使用的时候会被调用,如果一个对象从未被使用,那么他的构造器也不会被执行;对象本质上拥有类(scala中)的所有特性,除此之外,object还可以一扩展类以及一个或者多个特质

class

在scala中,类名可以和对象名为同一个名字,该对象称为该类的伴生对象,类和伴生对象可以相互访问他们的私有属性,但是

他们必须在同一个源文件内。类只会被编译,不能直接被执行,类的申明和主构造器在一起被申明,在一个类中,主构造器只有一个,

所有必须在内部申明主构造器或者是其他申明主构造器的辅构造器,主构造器会执行类定义中的所有语句。scala对每个字段都会提供

getter和setter方法,同时也可以显示的申明,但是针对val类型,只提供getter方法,默认情况下,字段为公有类型,可以在setter

方法中增加限制条件来限定变量的变化范围,在scala中方法可以访问改类所有对象的私有字段

Scala中的=>符号可以看做是创建函数实例的语法糖。例如:A => T,A,B => T表示一个函数的输入参数类型是“A”,“A,B”,返回值类型是T。请看下面这个实例:

scala> val f: Int => String = myInt =>"The value of myInt is: "+ myInt.toString()

f: Int => String =

scala> println(f(3))

The value of myInt is:3

上面例子定义函数f:输入参数是整数类型,返回值是字符串。

另外,() => T表示函数输入参数为空,而A => Unit则表示函数没有返回值。

举例:

[plain]view plaincopy

1.var increase = (x: Int) => x + 1

increase(10)

res0: Int = 11

类似于转化符号,=>指明这个函数把左边的东西(任何整数x)转变成右边的东西(x + 1)。所以,这是一个把任何整数x映射为x + 1的函数。

//这个函数的定义体现了一种从外剥皮的状态

//传入第一个参数x的值之后,从新生成一个新的函数,这个函数需要一个参数y

//当输入y的值之后将会得到最终的结果

def first(x:Int)=(y:Int)=>x+y

first: (x: Int)Int => Int

在Scala中符号“_”有一种待定的意思在里面

在拥有头等函数的语言中,即使语言的语法是固定的,你也可以有效地制作新的控制结构。所有你需要做的就是创建带函数做参数的方法。

上一篇下一篇

猜你喜欢

热点阅读