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

12 篇文章 0 订阅
3 篇文章 0 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值