`

Scala Polymorphism

 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/2334855

 

这里看一个《Scala编程思想》中提供的一个多态示例,个人认为相当具有学习意义

Name.scala

package org.fool.scala.util

import scala.reflect.runtime.currentMirror

trait Name {
  override def toString: String = Name.className(this)
}

object Name {
  def className(o: Any) = currentMirror.reflect(o).symbol.toString.replace("$", " ").split(" ").last
}

Note:

这里先用Scala的反射机制重写toString方法获取类的实际名字

 

PolymorphismTest.scala

package org.fool.scala.polymorphism

import org.fool.scala.util.Name

class Element extends Name {
  def interact(other: Element) = s"$this interact $other"
}

class Inert extends Element

class Wall extends Inert

trait Material {
  def resilience: String
}

trait Wood extends Material {
  def resilience = "Breakable"
}

trait Rock extends Material {
  def resilience = "Hard"
}

class RockWall extends Wall with Rock

class WoodWall extends Wall with Wood

trait Skill

trait Fighting extends Skill {
  def fight = "Fight!"
}

trait Digging extends Skill {
  def dig = "Dig!"
}

trait Magic extends Skill {
  def castSpell = "Spell!"
}

trait Flight extends Skill {
  def fly = "Fly!"
}

class Character(var player: String = "None") extends Element

class Fairy extends Character with Magic

class Viking extends Character with Fighting

class Dwarf extends Character with Digging with Fighting

class Wizard extends Character with Magic

class Dragon extends Character with Magic with Flight

object PolymorphismTest extends App {
  val d = new Dragon
  d.player = "Puff"
  // Dragon interact Wall
  println(d.interact(new Wall))

  def battle(fighter: Fighting) = s"$fighter, ${fighter.fight}"

  // Viking, Fight!
  println(battle(new Viking))
  // Dwarf, Fight!
  println(battle(new Dwarf))
  // anon, Fight!
  println(battle(new Fairy with Fighting))

  def fly(flyer: Element with Flight, opponent: Element) =
    s"$flyer, ${flyer.fly}, ${opponent.interact(flyer)}"

  // Dragon, Fly!, Fairy interact Dragon
  println(fly(d, new Fairy))
}

Note:

new Fairy with Fighting

该对象的类型是使用new表达式将现有的Fairy类与Fighting特征结合起来自己创建的,这样就创建了一个新类,而我们又立即创建了该类的一个实例。由于我们并没有给这个类起名字,因此Scala会帮我们起一个:$anon$1(anon是anonymous的缩写),而1是在Element的id碰到它时产生的。 

 

Console Output


 

参考资料:

Scala编程思想

 

 

 

  • 大小: 15.4 KB
分享到:
评论

相关推荐

    scala sdk scala-2.12.3

    Scala SDK,全称为Scala Software Development Kit,是用于开发Scala应用程序的核心工具集。Scala是一种多范式的编程语言,融合了面向对象和函数式编程的特点,它运行在Java虚拟机(JVM)上,能够充分利用Java生态...

    scala3 scala3 scala3 scala3 scala3

    Scala3,也被称为Scala 3或Dotty,是Scala编程语言的一个重大更新,旨在提高其简洁性、可读性和类型安全性。Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对...

    scala2.12.1Windows镜像包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala2.12.1Windows镜像包"是为Windows操作系统设计的Scala编程环境的安装包,版本号为2.12.1。Scala 2.12.x系列是其重要的一个稳定...

    scala-2.12.10.zip

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个"scala-2.12.10.zip"文件是Scala编程语言的特定版本——2.12.10,专为Windows操作系统设计的安装包。Scala 2.12.x系列是该语言的一个...

    scala + mybatis 数据库查询

    Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特性。MyBatis则是一款流行的Java持久层框架,主要用于简化数据库操作。在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与...

    scala实战高清讲解

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面表现出色。"Scala实战高清讲解"这本书是学习Scala的宝贵资源,尤其对于那些希望深入理解并提升Scala技能的...

    Scala语法简明教程

    ### Scala语法简明教程知识点详解 #### Scala语言简史 - **诞生历史**:Scala起源于瑞士联邦理工学院洛桑(EPFL),由Martin Odersky在2001年开始设计,其灵感来源于Funnel——一种结合了函数式编程思想与Petri网...

    最好的scala学习 课件

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理领域,特别是与Apache Spark相结合时。本课件是针对Scala学习者精心准备的资源,旨在帮助你深入理解和掌握Scala的...

    scala-2.11.8.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala-2.11.8.rar"压缩包包含了Scala语言的2.11.8版本的源代码,这对于理解Scala的工作原理、学习高级编程技巧以及进行自定义扩展或...

    Scala考试题1

    Scala 是一种多范式的编程语言,它融合了面向对象和函数式编程的特性。下面将详细解释题目中涉及的Scala知识点: 1. **var、val 和 def 的区别**: - `var` 定义可变变量,可以多次赋值。 - `val` 定义不可变变量...

    scala-2.12.14.zip&scala-2.12.11.tgz Linux版本压缩包.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象编程和函数式编程的概念,被广泛应用于大数据处理和分布式计算领域,特别是在Apache Spark等框架中。标题提到的"scala-2.12.14.zip&scala-2.12.11.tgz"是Scala的...

    学习scala好的项目

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、分布式计算和Web开发等领域。Spark是基于Scala构建的大数据处理框架,其高性能和易用性使得Scala在大数据领域备受...

    windows版scala-2.11.12.zip

    在这个"windows版scala-2.11.12.zip"压缩包中,包含的是Scala 2.11.12版本的Windows兼容安装文件,这是Scala的一个稳定版本,适用于开发人员在Windows操作系统上进行Scala编程。 Scala 2.11.x系列是Scala的一个主要...

    scala学习源代码

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性。这个"scala学习源代码"的压缩包文件很可能包含了用于教学或自我学习Scala编程的基础示例。让我们深入了解一下Scala语言的关键概念和特性。 ...

    scala-2.11.12 win msi 安装包

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。这个压缩包提供的文件是"scala-2.11.12 win msi 安装包",适用于Windows操作系统,版本号为2.11.12。这个版本的Scala是官方发布的,虽然原...

    Programming.in.Scala.pdf

    从上述内容来看,《Programming in Scala.pdf》不仅是一本介绍Scala编程语言的书籍,更是一本为读者提供深入了解和应用Scala语言的实用工具。书籍中的内容覆盖了从基础知识到高级特性的多个层面,确保读者能够在掌握...

    Scala-2.11.1.zip

    Scala是一种强大的静态类型编程语言,它融合了面向对象和函数式编程的概念,旨在提供一种可扩展的、高效的编程环境。Scala这个名字是“Scalable Language”的缩写,它旨在克服Java的一些局限性,同时保留其平台兼容...

Global site tag (gtag.js) - Google Analytics