大数据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咨询)。
- 大数据Spark“蘑菇云”行动-第11课:Scala面向接口彻底实战和Spark源码鉴赏
- 大数据Spark“蘑菇云”行动-第10课:Scala继承彻底实战和Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第10课:Scala继承彻底实战和Spark源码鉴赏.
- 大数据Spark“蘑菇云”行动-第13课Scala模式匹配实战和Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第9课:Scala类和对象彻底实战和Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第13课Scala模式匹配实战和Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第16课:Scala implicits编程彻底实战及Spark源码鉴赏
- 大数据Spark“蘑菇云”行动-第14课Scala集合上的函数式编程实战及Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第22课:Scala集合和高级函数操作实战及Spark源码鉴赏.
- 第11课:scala面向接口编程彻底实战和spark源码鉴赏
- 第11课:Scala面向接口彻底实战和Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第14课Scala集合上的函数式编程实战及Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第23课:Scala外部命令和正则表达式及Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第20课:Scala提取器、注解深度实战详解及Spark源码鉴赏大数据Spark “蘑菇云”行动前传第20课:Scala提取器、注解深度实战详解及Spark源码鉴
- 大数据Spark “蘑菇云”行动前传第4课:零基础彻底实战Scala控制结构及Spark源码解析
- 大数据spark蘑菇云行动前传第5课:零基础彻底实战Scala函数式编程及Spark源码解析
- 大数据Spark “蘑菇云”行动前传第7课:零基础实战Scala面向对象编程及Spark源码解析
- 大数据Spark “蘑菇云”行动前传18课:Scala偏函数、异常、Lazy值编码实战及Spark源码鉴赏
- 编程思想(1)
- 3.2决策树理论2--python深度机器学习
- Elasticsearch的使用场景深入详解
- C\C++中头文件string与string.h的区别
- 349. Intersection of Two Arrays
- 大数据Spark“蘑菇云”行动-第11课:Scala面向接口彻底实战和Spark源码鉴赏
- YII 中session和cookie的用法
- 【#英语造句1#】
- H-Index II
- Caffe学习笔记
- 最优雅,高效的javascript字符串拼接
- 事件分发与拦截
- xampp中Apache启动时443端口被占用
- 猎豹"快切App"中用到的Android开发技巧探索