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中还可以定义抽象方法的,可以自己试一下。

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

  • 相关阅读:
    S1 : 函数
    S1 :数组迭代方法
    S1 : 传递参数
    S1:new操作符
    S1:函数上下文
    S1:对象与JSON
    S1:运算符
    S1:变量
    代码规范的读后自己的感悟
    第三周学习总结
  • 原文地址:https://www.cnblogs.com/amunote/p/5751292.html
Copyright © 2011-2022 走看看