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笔记,
该文档详细的讲述了Scala的基础操作方法和高级使用方法
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函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 ...
ScalaOverview.pdf ScalaTutorial.pdf ProgrammingInScala.pdf(这本是书) 博文链接:https://dogstar.iteye.com/blog/182673
Scala和Spark大数据分析函数式编程、数据流和机器学习
[Scala学习笔记-中文资料] 从java角度看Scala
快学Scala完整版,Scala编程(中文版)&Scala程序设计-多线程编程实践,非常清晰,适合阅读
scala学习
【课程大纲】 第1讲-Spark的前世今生 共12页 第2讲-课程介绍、特色与价值 共13页 第3讲-Scala编程详解:基础语法 共8页 ...第20讲-Scala编程详解:隐式转换与隐式参数 共9页 第21讲-Scala编程详解:Actor入门 共8页
【课程大纲】 第1讲-Spark的前世今生 共12页 第2讲-课程介绍、特色与价值 共13页 第3讲-Scala编程详解:基础语法 共8页 ...第20讲-Scala编程详解:隐式转换与隐式参数 共9页 第21讲-Scala编程详解:Actor入门 共8页
【课程大纲】 第1讲-Spark的前世今生 共12页 第2讲-课程介绍、特色与价值 共13页 第3讲-Scala编程详解:基础语法 共8页 ...第20讲-Scala编程详解:隐式转换与隐式参数 共9页 第21讲-Scala编程详解:Actor入门 共8页
内含Scala编程PDF版书籍 可详细学习Scala编程 内含Scala编程PDF版书籍 可详细学习Scala编程
第2章,“Scala的第一步”,展示给你如何使用Scala完成若干种基本编程任务,而不牵涉过多关于如何工作的细节。本章的目的是让你的手指开始敲击并执行Scala代码。 第3章,“Scala的下一步”,演示更多的基本编程任务...
函数式编程(FP)是一种...《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。
Scala学习资源Scala编程语言抓住了很多开发者的眼球。如果你粗略浏览Scala的网站,你会觉得Scala是一种纯粹的面向对象编程语言,而又无缝地结合了命令式编程和函数式编程风格。Christopher Diggins认为: 不太久...