`
fineqtbull
  • 浏览: 51216 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Scala学习笔记(Scala编程第20章 Abstract Members 例子分析)

阅读更多
Scala编程第20章 Abstract Members 例子分析。

源程序:
/**
 * 《Programming In Scala》第20章 Abstract Members 例子
 */
package org.stairwaybook.currencies

//货币区域基类
abstract class CurrencyZone {
    //货币类型,虚类型,用于方法的参数化,由于上界为AbstractCurrency所以子类型中定义
    //的实类型必须是AbstractCurrency的子类
    type Currency <: AbstractCurrency
    //工厂方法,虚方法,创建货币对象
    def make(x: Long): Currency
    //货币类型基类
    abstract class AbstractCurrency {
        //数量
        val amount: Long
        //货币名称
        def designation: String
        //加法操作
        def + (that: Currency): Currency =
            make(this.amount + that.amount)
         //乘法操作
        def * (x: Double): Currency =
            make((this.amount * x).toLong)
        //减法操作
        def - (that: Currency): Currency =
            make(this.amount - that.amount)
        //除法操作
        def / (that: Double) =
            make((this.amount / that).toLong)
        //除法操作,(货币对象之间除)
        def / (that: Currency) =
            this.amount.toDouble / that.amount
        //汇率转换操作
        def from(other: CurrencyZone#AbstractCurrency): Currency =
            //从Converter.exchangeRate中取得汇率然后计算转换结果
            make(Math.round(
                other.amount.toDouble * Converter.exchangeRate
                    (other.designation)(this.designation)))
        //求以10为底的对数
        private def decimals(n: Long): Int =
            if (n == 1) 0 else 1 + decimals(n / 10)
        //货币的文本描述
        override def toString =
            //用货币的单位值来计算小数和整数部分
            ((amount.toDouble / CurrencyUnit.amount.toDouble)
            formatted ("%."+ decimals(CurrencyUnit.amount) +"f")
            +" "+ designation)
    }
    //货币单位值
    val CurrencyUnit: Currency
}
//汇率转换单例对象
object Converter {
   //货币汇率对照表
   var exchangeRate = Map(
        "USD" -> Map("USD" -> 1.0 , "EUR" -> 0.7596,
                    "JPY" -> 1.211 , "CHF" -> 1.223),
        "EUR" -> Map("USD" -> 1.316 , "EUR" -> 1.0 ,
                    "JPY" -> 1.594 , "CHF" -> 1.623),
        "JPY" -> Map("USD" -> 0.8257, "EUR" -> 0.6272,
                    "JPY" -> 1.0 , "CHF" -> 1.018),
        "CHF" -> Map("USD" -> 0.8108, "EUR" -> 0.6160,
                    "JPY" -> 0.982 , "CHF" -> 1.0 )
    )
}
//美元区域单例对象
object US extends CurrencyZone {
    //美元基类
    abstract class Dollar extends AbstractCurrency {
        def designation = "USD"
    }
    //货币类型,父类中虚类型的实例化
    type Currency = Dollar
    //创建美元对象,cents为美分数
    def make(cents: Long) = new Dollar {
        val amount = cents
    }
    //1美分的值
    val Cent = make(1)
    //1美元的值
    val Dollar = make(100)
    //单位值为美元
    val CurrencyUnit = Dollar
}
//欧元区域单例对象
object Europe extends CurrencyZone {
    //欧元基类
    abstract class Euro extends AbstractCurrency {
        def designation = "EUR"
    }
    //货币类型
    type Currency = Euro
    //创建欧元对象,cents为欧分数
    def make(cents: Long) = new Euro {
        val amount = cents
    }
    //1欧分的值
    val Cent = make(1)
    //1欧元的值
    val Euro = make(100)
    //单位值为欧元
    val CurrencyUnit = Euro
}
//日元区域单例对象
object Japan extends CurrencyZone {
    //日元基类
    abstract class Yen extends AbstractCurrency {
        def designation = "JPY"
    }
    //货币类型
    type Currency = Yen
    //创建日元对象,yen为日元数
    def make(yen: Long) = new Yen {
        val amount = yen
    }
    //1日元的值
    val Yen = make(1)
    //单位值为日元
    val CurrencyUnit = Yen
}
//文件主单例对象,作为本文件的主执行程序
object App extends Application {
    //将100美元换成日元
    val yen : Japan.Currency = Japan.Yen from US.Dollar * 100
    println(yen)
    //将上述日元转换为欧元
    val euro = Europe.Euro from yen
    println(euro)
    //将上述欧元转换回美元
    val dollar = US.Dollar from euro
    println(dollar)
    //进行加法计算
    val d2 = US.Dollar * 100 + dollar
    println(d2)
}


执行结果:
12110 JPY
75.95 EUR
99.95 USD
199.95 USD
分享到:
评论

相关推荐

    Scala学习笔记,大全笔记

    Scala学习笔记,大全笔记

    Scala学习笔记(全)

    ### Scala学习笔记(全) #### 一、Scala概述与特点 Scala是一种多范式的编程语言,旨在集成面向对象编程和函数式编程的各种特性。它运行于Java平台(Java虚拟机JVM),并且能够完全兼容所有的Java程序。这使得Scala...

    scala学习笔记整理

    在"scala学习笔记整理"中,我们可以深入探讨以下关键知识点: 1. **基础语法**:Scala的基础语法与Java有相似之处,但也有很多独特的特点。例如,它支持变量的不可变性(immutability),使用`val`声明常量,`var`...

    scala编程中文pdf

    scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...

    Scala学习笔记

    ### Scala学习笔记关键知识点 ...以上内容涵盖了Scala学习笔记中的关键知识点,从并发编程到函数式编程的核心概念,再到Scala语言本身的一些特殊规则和特点,这些都是学习Scala时需要掌握的基础知识。

    Scala编程 pdf

    Scala编程是一种多范式、函数式和面向对象的编程语言,设计目的是为了提高开发者的生产力,同时保持代码的可维护性和高性能。它是由Martin Odersky在2003年设计并实现的,融合了Java虚拟机(JVM)的优势,并引入了...

    Scala和Spark大数据分析函数式编程、数据流和机器学习

    Scala是一种静态类型的函数式编程语言,而Spark是一个分布式计算框架,尤其适合于大数据处理和分析。本教程将深入探讨这两者如何结合,实现高效的大数据分析、数据流处理以及机器学习任务。 首先,让我们来理解...

    快学Scala完整版&Scala编程(中文版)&Scala程序设计-多线程编程实践

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面尤为出色。这个压缩包包含了三本关于Scala学习的重要资源,分别是《快学Scala》完整版书籍、《SCALA程序...

    Scala函数式编程

    《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 ...

    scala学习笔记1

    ScalaOverview.pdf ScalaTutorial.pdf ProgrammingInScala.pdf(这本是书) 博文链接:https://dogstar.iteye.com/blog/182673

    [Scala学习笔记-中文资料]从java角度看Scala

    [Scala学习笔记-中文资料] 从java角度看Scala

    读书笔记:scala 编程代码实际例子.zip

    读书笔记:scala 编程代码实际例子

    scala学习资料

    Scala是一种强大的、现代的编程语言,它融合了面向对象编程(OOP)和函数式编程(FP)的特性,为开发者提供了丰富的表达能力和高效的代码执行环境。作为Java平台上的一个成员,Scala程序可以在Java虚拟机(JVM)上...

    读书笔记:Scala编程学习.zip

    读书笔记:Scala编程学习

    最好的scala学习 课件

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理...通过深入学习和实践,你不仅可以掌握Scala语言,还能有效利用Scala在大数据分析和处理项目中发挥出Spark的强大性能。

    Scala-学习资料-mht.rar

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发、大数据分析以及构建高性能系统时表现卓越。在"Scala-学习资料-mht.rar"这个压缩包中,包含了关于Scala的学习资料,格式为...

    scala讲解笔记 入门及进阶 PDF文档1-5

    第二部分:"Scala入门及进阶-part02-类和对象.pdf" 主要讲解Scala的面向对象特性。这部分内容会详细介绍类的创建、对象的实例化、继承、封装和多态性等概念。Scala的特质(Trait)也会在这里提及,它是实现多重继承...

Global site tag (gtag.js) - Google Analytics