trait in scala

大多数情况下, Scala 中的 trait 相当于 Java 中的借口, 或者 Perl 6 中的 Role。Scala 可以继承多个 trait。

trait 作为接口

trait BaseSoundPlayer {
    def play
    def close
    def pause
    def stop
    def resume
}

和 OC 中的接口类似, 如果方法带有参数,则声明时加上参数即可:

trait Dog {
    def speak(whatToSay: String)
    def wagTail(enabled: Boolean)
}

类继承 trait 时需要使用 extends 和 with 关键字, 如果类只继承一个 trait, 则只使用 extends 就够了:

class Mp3SoundPlayer extends BaseSoundPlayer { ...

继承一个类和一个或多个 trait 时,对类使用 extends, 对 trait 使用 with:

class Foo extends BaseClass with Trait1 with Traits { ...

当一个类继承多个 trait 时,使用 extends 继承第一个 trait ,对其余的 trait 使用 with:

class Foo extends Trait1 with Trait2 with Trait3 with Trait4 { ...

真是够了, 继承了 trait , 语法还啰嗦还不一致,Perl 6 就直接 :

class Dog is Animal does eat does jump { ...  

Scala 丑哭。

继承了 trait, 就要实现 trait 中定义好的所有方法:

class Mp3SoundPlayer extends BaseSoundPlayer {
    def play         { // code here ... }
    def close       { // code here ... }
    def pause     { // code here ... }
    def stop        { // code here ... }
    def resume   { // code here ... }
}

如果类继承了 trait 但是没有实现它的抽象方法, 那么这个类就必须被声明为抽象类:

// must be declared abstract because it does not implement all of the BaseSoundPlayer methods
abstract class SimpleSoundPlayer extends BaseSoundPlayer {
    def play   { ... }
    def close { ... }
}

trait 还可以继承另外一个 trait:(😄)

trait Mp3BaseSoundPlayer extends BaseSoundFilePlayer {
    def getBasicPlayer: BasicPlayer
    def getBasicController: BasicController
    def setGain(volume: Double)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇讲义只讲scala的简单使用,目的是使各位新来的同事能够首先看懂程序,因为 scala 有的语法对于之前使用习...
    MrRobot阅读 2,962评论 0 10
  • 全球狂欢 偏偏我要 和我独处
    情话信使阅读 309评论 0 13
  • 今天看到一个妹子的公众号。 我忍不住想要吐。 不好意思,因为实在是鸡汤味太重了。 不知道从什么时候起,人们开始对这...
    一方枝言阅读 349评论 1 2
  • 原宿 —— 中野 明治神宫 —— 竹下通步行街 —— 中野bourdway centre —— 黑松和牛 —— ア...
    埃尔默海的爱德华阅读 213评论 0 1
  • 文/李智彬 秋雨濛濛,淡烟深锁明湖畔。 清风微叹,落尽残花片。 径入柳寒,绿皱烟波瀚。 漂琼片,幽香拂面,意倦凭阑看。
    李智彬阅读 352评论 0 2