大数据Spark“蘑菇云”行动-第11课:Scala面向接口彻底实战和Spark源码鉴赏

来源:互联网 发布:三菱plc脉冲输出编程 编辑:程序博客网 时间:2024/04/28 09:31

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.basicstrait 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.basicstrait 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咨询)。

1 0
原创粉丝点击