Scala编程入门---面向对象编程之Trait

Scala中Trait是一种特殊概念

首先我们可以将Triat做为接口来使用,此时的Triat就与java中的接口非常相似

在Triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出具体的实现即可

类可以使用extend是关键字来继承Triat,注意这里不是Implement,而是extends,在Scala中没有Implement的概念,无论是继承还是Triat都是extends

类继承Triat后,必须实现其中的抽象方法,实现是不需要override关键字

Scala不支持对类进行多继承,但是支持多重继承triat,使用with关键字即可

triat sayHello{
    def sayHello(name:String)
}

triat makeFriends{
    def makeFriends(p:Person)
}

class Person(val name:String) extends sayHello with makeFriends{
    def sayHello(otherName:String)= println("hello,"+otherName+",i‘m"+name)
    def makeFriends(p:Person) = println("Hello"+p.name+",I‘m"+name+"i want to make friend with you ")
}

val p = new Person("leo")val p2 = new Person("jack")

p.sayHello("jack")p.makeFriends(p2

在Triat中定义具体方法

Scala中的Triat可以不是只定义抽象方法,还可以定义具体方法,此时的Triat更像是包含了通用工具方法的东西

有一个专有名词来形容这种情况,就是说Triat的功能混入了类

举例来说,triat中可以包含一些很多类都通用的功能方法,比如打印日志,sprak中就使用了triat来定义了通用日志打印法

triat Logger{
    def log(message:String) = prinl("msg:"message)
}

class Person(val name:String) extends Logger{
    def makeFrinds(p:Person){
        println("Hi,i‘m"+name+",i‘m glad to make friends with you ,"+p.name)
        log("make friends method is invoked with parameter Person[name="+p.name+"]")
    }
}

在Triat中定义具体字段

Scala中Triat可以定义具体field,此时继承triat就自动获取了triat中定义的field

但这种获取field的方式与继承扯拉学说是不同的:如果是继承class获取的field,实际是定义在父类中的。而继承triat获取的field,就直接被添加到类中

triat Person{
    val eyeNum =2
}

class student(name:String) extends Person{

    def  sayHello =println("Hi ,i‘m "+name+",I have "+eyeNum+"eyes")
}

在triat中定义抽象字段

Scala中Triat可以定义抽象filed,triad中的具体方法可以依据抽象filed来编写

但是继承triat类,侧必须覆盖抽象filed,提供具体值

triat SayHello{
    val mes:String
    def sayHello(name:String) = println(mes+","+name)
}

class Person(name:String) extends SayHello{
    val msg:Stirng = "hello"
    def makeFriends(p:Person){
        sayHello()
        println("I‘m"+name+", I want to make friends with you !")
    }
}
时间: 2024-08-06 08:15:49

Scala编程入门---面向对象编程之Trait的相关文章

Scala编程入门---面向对象编程之Trait高级知识

trait调用链 Scala中支持让类继承多个Trait后,依次调用多个Trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行super.方法即可 类中调用多个trait中都有这个方法时,首先会从最右边的trait的方法开始执行,然后依次往左执行,形成一个调用链条 这种特性非常强大,其实就相当于设计模式中的责任链模式的一种具体实现依赖 trait Handle{ def handle(data:String){} } trait DataValidHandler extend

scala学习笔记-面向对象编程之Trait(13)

将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念 2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 3 // 在triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可 4 // 类可以使用extends关键字继承trait,注意,这里不是implement,而是extends,在scala中没有implement的概念,无论继承类还是trait,统一都是extends 5 // 类继承tra

Scala编程入门---Map与Tuple

创建Map //创建一个不可变的Map val ages = Map("Leo" -> 30,"Jen" ->25,"Jack" ->23) ages("Leo") =31 //创建一个可变的Map val ages =scala.collection.mutable.Map("Leo" ->30,"Jen" ->25,"Jack" -&

Scala编程入门---数组操作之数组转换

使用yield和函数式编程转换数组 //对Array进行转换,获取的还是Aarry val a = Array(1,2,3,4,5) val a2 = for(ele <- a) yield ele * ele //对ArrayBuffer进行转换,获取的还是ArrayBuffer val b = ArrayBuffer[Int]() b+=(1,2,3,4,5) val b2=for(ele <- b) yield ele*ele //结合if守卫, 仅转换需要元素 val a3= for(

Scala编程入门一

Scala程序可以以解释器的方式进行执行,但是它实际上并不是一个解释器.实际发生的是,输入的内容被快速地编译成字节码,然后字节码交给Java虚拟机执行,所以你可以称它为REPL Windows上Scala的开发环境搭建如百度经验所示:http://jingyan.baidu.com/article/5552ef471a1cd2518ffbc925.html 执行 scala>8 * 5 + 2 结果为 res0:    Int =42 答案被命名为res0,你可以在后续操作中使用这个名称: sc

(升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课程会涵盖Scala编程详解.Spark核心编程.Spark SQL和Spark Streaming.Spark内核以及源码剖析.性能调优.企业级案例实战等部分.完全从零起步,让学员可以一站式精通Spark企业级大数据开发,提升自己的职场竞争力,实现更好的升职或者跳槽,或者从j2ee等传统软件开发工程

Spark2.0从入门到精通:Scala编程、大数据开发、上百个实战案例、内核源码深度剖析视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

Scala 面向对象编程之对象

此对象非彼java bean对象 是scala object的对象 Object // object,相当于class的单个实例,通常在里面放一些静态的field或者method // 第一次调用object的方法时,就会执行object的constructor,也就是object内部不在method中的代码:但是object不能定义接受参数的constructor // 注意,object的constructor只会在其第一次被调用时执行一次,以后再次调用就不会再次执行constructor了

深入理解JavaScript系列(17):面向对象编程之概论

介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基本关系 - 继承)之间的关系是如何,也可以在讨论中使用(我希望将消除之前对于JavaScript中OOP的一些概念歧义). 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-7-1-oop-general-theory/ 概论.范式与思想 在进行E