zoukankan      html  css  js  c++  java
  • scala学习手记31

    不知道大家对java的接口是如何理解的。在我刚接触到接口这个概念的时候,我将接口理解为一系列规则的集合,认为接口是对类的行为的规范。现在想来,将接口理解为是对类的规范多少有些偏颇,更恰当些的观点应该是:相对于类来说,接口是更深层次的抽象,虽然同时接口也起到了规定类的行为的作用。

    和java的接口比起来,scala的Trait可能更具体一些。正如Trait的含义一样,它指的是一种特质,如果认为类有某种特质就混入对应的Trait好了。在scala中,类是对现实某一类事务的建模,而Trait则是对已有模型的补充。

    个人以为,Trait这个概念理解起来要比接口更容易一些。

    看个例子吧:狗是人类的好朋友,它在我们孤单的时候默默地陪伴。用scala可以这样定义:

    trait Friend{
      val name : String
      def accompany() = println("Your friend " + name + " accompanies  you")
    }
    
    class Dog(val name : String) extends Friend

    在代码中我们先定义了一个trait。在这个trait有一个名为name的val,但是并没有提供默认值。我们可以认为它是抽象的,需要混入trait的类提供具体的实现。这个trait还提供了一个默认的方法accompany,因为朋友的特征就是陪伴。

    混入trait的类可以调用trait的方法:

    new Dog("Bob").accompany()

    执行结果:

    image

    此外,混入trait的类还可以重写trait的方法:

    class Dog(val name : String) extends Friend{
      override def accompany() = println(name + " accompanies you")
    }
    
    new Dog("Bob").accompany()

    执行结果:

    image

    一个类混入trait后,可以通过它的实例调用trait的方法,它的实例还可以被当做是trait的引用:

    new Dog("Bob").accompany()
    
    val bob : Friend = new Dog("Bob")
    bob.accompany()

    执行结果:

    image

    一个类混入trait的数量是任意的。用关键字with就可以混入更多的trait。比如,狗除了是人类的好朋友,还是忠诚的卫士,随时都会保护我们:

    trait Friend{
      val name : String
      def accompany() = println("Your friend " + name + " accompanies  you")
    }
    
    trait Guard{
      val name: String
      def guard() = println(name + " is guarding you!")
    }
    
    class Dog(val name : String) extends Friend with Guard{
      override def accompany() = println(name + " accompanies you")
    }
    
    val bob  = new Dog("Bob")
    bob.accompany()
    bob.guard()

    trait会被编译成接口和实现其方法的类。不过除了多继承这个方面以外,trait更像是抽象类。尽管在JAVA8以后,接口中也可以由默认方法了,但是变量的定义还是不可以的。忘了演示了,trait中还可以定义抽象方法的,可以自己试一下。

    ############

  • 相关阅读:
    Chapter 03Using SingleRow Functions to Customize Output(03)
    Chapter 03Using SingleRow Functions to Customize Output(01)
    Chapter 04Using Conversion Functions and Conditional ExpressionsNesting Functions
    Chapter 04Using Conversion Functions and Conditional ExpressionsGeneral Functions
    Chapter 11Creating Other Schema Objects Index
    传奇程序员John Carmack 访谈实录 (zz.is2120)
    保持简单纪念丹尼斯里奇(Dennis Ritchie) (zz.is2120.BG57IV3)
    王江民:传奇一生 (zz.is2120)
    2011台湾游日月潭
    2011台湾游星云大师的佛光寺
  • 原文地址:https://www.cnblogs.com/amunote/p/5751292.html
Copyright © 2011-2022 走看看