Scala 基础 (六):面向对象(下篇)
在之前的文章中总结了 Scala 面向对象模块基础的内容,接下来学习面向对象的高阶内容。
一、抽象类
如何定义?
如果父类为抽象类,那么子类需要将抽象的属性和方法实现,否则子类也需声明为抽象类
重写非抽象方法需要用
override
修饰,重写抽象方法则可以不加override
子类中调用父类的方法使用
super
关键字子类对抽象属性进行实现,父类抽象属性可以用
var
修饰;子类对非抽象属性重写,父类非抽象属性只支持
val
类型,而不支持var
。因为var
修饰为可变量,子类继承后可以直接使用修改,没有必要重写。
举个栗子:
匿名子类
和 Java 一样,可以通过包含带有定义或重写的代码块的方式创建一个匿名的子类。匿名子类只针对抽象类和接口。
举个栗子:
二、单例对象(伴生对象)
Scala 是一门完全面向对象的语言,没有静态操作。为了能够和 Java 语言进行交互,使用单例对象来取代static
关键字的语义,伴生类的静态声明
都可放在伴生对象中。
基本语法:
编译后会生成两个类,伴生对象是伴生类(类名为对应类后加 $符号)的单例对象。
单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致,必须在同一个文件中。
单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。
Scala 中
obj(arg)
的语句实际是在调用该对象的apply
方法,即obj.apply(arg)
。用以统一面向对象编程和函数式编程的风格。Scala 底层对于伴生对象的
apply
方法进行了优化,调用时可以省略方法名,直接使用单例对象的名称+调用apply方法的参数
当使用
new
关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时,调用的其实时伴生对象的apply
方法
举个栗子:
三、特质
如何定义特质?
Scala 语言中,采用特质
trait
(特征)来代替接口的概念多个类具有相同的特征时,就可以将这个特征提取出来,用继承的方式来复用
Scala 中的 trait 中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入(
mixin
)多个特质。这种感觉类似于 Java 中的抽象类。
基本语法:
如果一个类在同时继承特质和父类时,应当把父类写在
extends
后。特质中可以定义抽象和非抽象的属性和方法。
特质叠加引发两种冲突
第一种:一个类(
Sub
)混入的两个 trait(TraitA
,TraitB
)中具有相同的具体方法,且两个 trait 之间没有任何关系
如果当前父类和特质里面出现了相同的属性和方法,就会起冲突,必须在当前实现的子类(sub
)中进行重写。
举个栗子:
第二种:一个类(
Sub
)混入的两个 trait(TraitA
,TraitB
)中具有相同的具体方法,且两个 trait 继承自相同的 trait(TraitC
)
Scala 采用了特质叠加的策略来解决这类冲突。
举个栗子:
当一个类混入多个特质的时候,scala 会对所有的特质及其父特质按照一定的顺序进行排序,而此案例中的
super.describe(
)调用的实际上是排好序后的下一个特质中的describe()
方法。要调用某个指定的混入特质中的方法,可以增加约束:
super[]
自身类型
自身类型可实现依赖注入的功能。
一个类或者特征指定了自身类型的话,它的对象和子类对象就会拥有这个自身类型中的所有属性和方法。
是将一个类或者特征插入到另一个类或者特征中,属性和方法都就像直接复制插入过来一样,能直接使用。但不是继承,不能用多态。
举个栗子:
_: SelfType =>
,其中_
的位置是别名定义,也可以是其他,_
指代 this。插入后就可以用this.xxx
来访问自身类型中的属性和方法了。
抽象类和特质的区别?
优先使用特质。一个类可以扩展多个特质,但是只能扩展一个抽象类。需要构造函数参数,使用抽象类,抽象类可以定义带参的构造器,特质只是无参的构造器。
四、扩展内容
类型检查和转换
obj.isInstanceOf[T]
:判断obj
是不是T
类型。obj.asInstanceOf[T]
:将obj
强转成T
类型classOf
获取对象的类名。结果是class package.xxx.className
获取对象的类:
obj.getClass
枚举类
需要继承
Enumeration
。用
Value
类型定义枚举值。
应用类
继承 App,包装了 main 方法,就不需要显式定义 main 方法了,可以直接执行。
定义新类型
使用 type 关键字可以定义新的数据数据类型名称,本质上就是类型的一个别名
type SelfDefineType = TargetType
。
本次分享的内容到这里就结束了,希望对大家学习 Scala 语言有所帮助!!!
版权声明: 本文为 InfoQ 作者【百思不得小赵】的原创文章。
原文链接:【http://xie.infoq.cn/article/354991d36a218abfdd8eaa1b0】。文章转载请联系作者。
评论