1、Scala中的接口,可以没有抽象方法,有具体的实现。
比如:
trait Logging{
…
}
是辅助的工具类。其他的类可以继承它,然后就可以调用该接口的工具方法,下面的示例:
class SparkContext(…) extends Logging with…
这样SparkContext就可以直接使用Logging 接口的方法。
2、类的继承,第一个关键字用extends,然后后续继承其他的类或者接口使用with关键字。
3、接口(trait) 支持多重继承, 后面使用with…来实现,但是类或者抽象类不支持多重继承。
比如:
class SparkContext(config: SparkConf) extends Logging with ExecutorAllocationClient {
语法小细节:
接口被子类继承,与类或者抽象类被子类继承,是否一样的?
不一样,接口被子类继承,接口的方法是被添加到子类,但是父类是类就不一样,仍然是父类里面的。
接口的方法没有被实现,就是抽象方法。
4、抽象属性、抽象成员
定义一个抽象的属性,必须说明其类型,比如:
val name:String
不说明类型,编译会出错。
在具体的实现子类中必须对其进行赋值。
trait除了作为工具类,还可以:
TreeNode继承了Product
abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product {
Product 继承了Any 又混入了Equals 接口。
trait Product extends Any with Equals {
使用with关键字继承更多接口,把它称为 混入
5、类的实例对象也可以混入接口,以扩展当前的对象实例的功能。这个比较特殊!
示例:
package com.dtspark.scala.basics
trait Logger{
def log(message: String){
println("Logger: " + message)
}
}
trait RichLogger extends Logger{
override def log(message: String){
println("RichLogger: " + message)
}
}
class Loggin(val name: String) extends Logger{
def loggin{
println("Hi, welcome ! " + name)
log(name)
}
}
object HelloTrait {
def main(args: Array[String]): Unit = {
val personLoggin = new Loggin("DTSpark") with RichLogger
personLoggin.loggin
}
}
此时的运行结果为:
Hi, welcome ! DTSpark
RichLogger: DTSpark
类的实例对象new Loggin(“DTSpark”)混入RichLogger接口
以上代码,演示了,在Loggin类的实例对象中,混入了RichLogger接口,这样就可以用来扩展第三方的实现。
6、一个类同时继承了多个trait。假设这些trait都有一个同名的方法,那么该类是按照用右到左顺序,优先执行最右边的那个trait的方法。该类必须override 来复写同名方法,否则会报conflicting错。
package com.dtspark.scala.basics
trait Logger {
def log(message: String) {
println("Logger: " + message)
}
}
trait RichLogger {
def log(message: String) {
println("RichLogger: " + message)
}
}
class Loggin(val name: String) extends Logger with RichLogger{
def loggin {
println("Hi, welcome ! " + name)
log(name)
}
override def log(message: String): Unit = {
super.log(message)
}
}
object HelloTrait {
def main(args: Array[String]): Unit = {
val personLoggin = new Loggin("DTSpark")
personLoggin.loggin
}
}
此时的运行结果为:
Hi, welcome ! DTSpark
RichLogger: DTSpark
7、类继承的父类有抽象方法,那么子类必须实现父类的抽象方法,否则会提示错误。
源码:
trait Information {
def getInformation: String
def checkIn: Boolean = {
getInformation.equals("Spark")
}
}
class Passenger(val name: String) extends Information {
}
错误提示:
Error:(37, 7) class Passenger needs to be abstract, since method getInformation in trait Information of type => String is not defined
class Passenger(val name: String) extends Information {
^
解决方法:
把Passenger 类定义为abstract类型,或者实现父类的getInformation属性。
本博声明:
博文内容源自DT大数据梦工厂大数据Spark“蘑菇云”前置课程。相关课程内容视频可以参考:
百度网盘链接:http://pan.baidu.com/s/1cFqjQu(如果链接失效或需要后续的更多资源,请联系QQ460507491或者微信号:DT1219477246 获取上述资料,或者直接拨打 18610086859咨询)。