`
edge
  • 浏览: 71141 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Scala概述(六)合成

阅读更多

6.       合成(composition

解释了Scala的类型抽象体系之后本节主要描述类的合成方式译注class composition似乎也没有固定的译法,此处翻译成合成”)Scala的基于混入的类合成(mixin class composition)体系是Brach[6]中的面向对象的线性混入合成(linear mixin compostion)和[1425]中提出的更加对称的混入模块(mixin modules),以及traits[42]这三者的融合。(注:mixin有些人翻译成混合,有些人翻译成混入)我们先看一个例子,如下这个迭代器的抽象描述:

trait AbsIterator[T] {

def hasNext: boolean

def next: T

}

注意上面出现的关键字traitTrait是一种特殊的抽象类,他的构造子没有任何值参数。Traits可以出现任何抽象类可以出现的地方,但反之不然,只有traits可以用于混入。

下面,我们用一个trait继承自AbsIterator,并增加一个方法foreach,用于将一个函数作用于该迭代子返回的每一个元素上。

trait RichIterator[T] extends AbsIterator[T] {

def foreach(f: T => unit): unit =

while (hasNext) f(next)

}

下面是一个具体的迭代子类定义,用于连续返回一个字符串的每一个字符:

class StringIterator(s: String) extends AbsIterator[char] {

private var i = 0

def hasNext = i < s.length

def next = { val x = s charAt i; i = i + 1; x }

}

 

混入式类合成(Mixin-class composition下面我们将RichIteratorStringIterator的功能合并在一个类中。只有单根继承和接口的情况下这是不可能的,因为这两个类都有具体的实现代码。因此,Scala提供了混入式类合成的机制,使程序设计者可以重用一个类的增量内容,也就是非继承的内容。这种机制使人可以将RichIteratorStringIterator合并,在如下所示的例子将一个字符串的所有字母打成一列。

object Test {

def main(args: Array[String]): unit = {

class Iter extends StringIterator(args(0))

with RichIterator[char]

val iter = new Iter

iter foreach System.out.println

}

}

Iter类通过RichIteratorStringIterator这两个父类型混入合成,第一个父类型仍然称为超类(superclass),第二个父类型则称为混入(mixin)。

 

类的全序化(Class Linearization

混入式类合成是多重继承的一种形式,因此也会面临单继承所没有的问题。最典型的就是:如果多个父类型定义了同名的成员,哪一个成员被继承?调用父类方法时那一个成员被引用?如果一个类从多个路径被继承了怎么办?在Scala中,解决这些问题的基础构造就是类的全序化(class linearization)。(注:linearization可以翻成线性化或者全序化,在计算机领域一般取后者。另外,后面大部分情况下用全序来替代,主要是为了读起来不那么别扭)

一个类C所直接继承的类形成的可递闭包当中所有类称为C的基类(base classes)。由于有混入类,一个类与它的基类之间的继承关系,构成一个有向无环图(directed acyclic graph)。C的全序化L(C)C的所有基类的一个全序(total order),根据如下规则构成:假设C的定义为:

class C extends B0 with . . . with Bn { . . . } .

这个全序以C的基类B0的全序为最后一部分,前面是B1的全序(排除掉已经包含在B0的全序当中的类),再前面是B2…Bn,同样排除掉前面已经出现过的类。最前面的是类C本身,作为这个全序的头一个类。例如,Iter类的全序化是:

{Iter, RichIterator, StringIterator, AbsIterator, AnyRef, Any }

类的全序对于类的继承关系而言是一种改进:如果一个类CD的子类,则在任何同时继承CD的类的全序中,C永远出现在D之前。全序化还满足另一个性质:一个类的全序永远包括其基类的全序作为后缀。例如,StringIterator的全序化:{ StringIterator, AbsIterator, AnyRef, Any }就是其子类Iter的全序的后缀。不过对于混入类,这个性质并不成立,一个混入类的全序当中的类,在其子类的全序当中可能以不同的顺序出现,也就是说,Scala中全序化不是单调(monotonic[1])的。

分享到:
评论
2 楼 bneliao 2009-08-06  

一个类的初始化顺序是怎样的?是和全序图一致?还是和c++中相似,先初始化基类?

在《Programming in Scala v6》第20章中的 初始化抽象类型,涉及到延迟初始化怎么理解。
希望可以得到回复。谢谢^_^
1 楼 edge 2009-06-28  
我晕死了,一不留神删除了这篇,只好重新发上来

JavaEye没个回收站什么的啊,惨,这下子连帖子的时间都不对了

相关推荐

    曲调:制作xenharmonic音乐并创建用于微音阶的合成器调整文件

    微米级模块化波形合成器功能列表音高转换在线性比率和对数比率之间转换在自定义...Scala(scl和kbm)格式创建调整图/应用实时调整有限的调整支持增强合成器的功能提前调谐多个频道或及时调谐单个频道如果根本不支持MTS...

    Muse-CGH:时尚的计算机生成的手写体

    概述 Muse可以从纯文本中合成时尚的英语手写内容。 它的算法仔细连接相邻字符的笔触以创建草书单词,并使用随机扰动来确保每个字符在渲染结果中都是唯一的。 下图显示了一些打印在纸上的渲染文本: 您可以通过上的...

    大数据技术分享 Spark技术讲座 按示例编程 共9页.pdf

    随着技术的发展,PBE已经开始支持多种编程语言,如Scala、R、PySpark等,这为程序员提供了更灵活的选择。 #### 4.3 集成现有工作流程 PBE技术正逐步集成到现有的开发工具和环境中,如IDE(Integrated Development ...

    mybatis-3.0.5.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    SQLite3的使用+API接口的调用

    SQLite3的使用+API接口的调用(c/c++、Qt)

    aws-java-sdk-s3-1.12.246.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    基于混沌-高斯变异-麻雀搜索算法的BP神经网络优化(CGSSA-BP)在电厂运行数据回归预测中的应用(含优化前后对比)MATLAB代码

    内容概要:本文介绍了如何使用混沌-高斯变异-麻雀搜索算法(CGSSA)优化BP神经网络来进行电力行业的回归预测。主要内容包括数据准备、BP神经网络构建、CGSSA优化过程、以及优化前后效果对比。通过MATLAB代码实现,展示了如何读取EXCEL数据并进行训练和测试,最终通过图表和误差指标对比优化前后的预测效果。 适用人群:适用于具有一定MATLAB编程基础和技术背景的研究人员、工程师,特别是从事电力数据分析和机器学习领域的专业人士。 使用场景及目标:① 对电厂运行数据进行精准回归预测,辅助电厂运维规划和能源分配优化;② 提供详细的代码实现和优化方法,帮助用户理解和应用CGSSA优化BP神经网络的技术。 其他说明:文中提供了完整的代码示例,包括主程序、数据划分、BP神经网络预测、CGSSA-BP神经网络预测和结果对比等功能模块。此外,还讨论了一些优化技巧和注意事项,如数据归一化、隐藏层节点选择等。

    第三方浏览器下载包.apk

    第三方浏览器下载包.apk

    嵌入式系统开发_ARM11架构_Linux操作系统_QT48开发环境_QTCreator工具_人脸识别算法_商业保密技术_QML界面开发_视频嵌入技术_跨平台移植_基于上海高校.zip

    嵌入式系统开发_ARM11架构_Linux操作系统_QT48开发环境_QTCreator工具_人脸识别算法_商业保密技术_QML界面开发_视频嵌入技术_跨平台移植_基于上海高校

    宠物领养救助系统 - Java课程设计/毕业设计项目 - SpringBoot+Vue+MySQL宠物领养平台

    宠物领养救助系统是基于SpringBoot+MyBatisPlus+Vue+MySQL开发的Java项目,适合作为Java课程设计、毕业设计或期末大作业。技术涵盖前后端开发,帮助初学者快速掌握Java全栈技能。采用IDEA开发,代码规范,易于二次扩展,是Java学习者的理想实战项目!

    winmm钢琴程序代码QZQ.txt

    winmm钢琴程序代码QZQ

    scratch少儿编程逻辑思维游戏源码-狗狗变形者.zip

    scratch少儿编程逻辑思维游戏源码-狗狗变形者.zip

    thymeleaf-2.0.8.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    基于回声状态网络(ESN)的数据分类预测算法实现与Matlab代码实践

    内容概要:本文详细介绍了基于回声状态网络(ESN)的数据分类预测方法及其Matlab实现。首先简述了ESN的基本概念,强调其作为特殊递归神经网络的特点,即储备池连接权值固定不变。接着逐步展示了从数据准备、ESN模型构建、训练到预测的具体步骤,包括参数设置、状态更新规则、输出层训练方法等。文中还探讨了各部分代码的作用及意义,并提供了调参建议,如谱半径、泄漏率等参数的选择依据。此外,作者分享了自己在实验过程中的一些经验和心得,指出ESN在处理时间序列分类任务方面的优势。 适合人群:对递归神经网络特别是ESN感兴趣的科研工作者、学生以及有一定编程基础并想深入了解ESN机制的研究人员。 使用场景及目标:适用于需要进行时间序列数据分析和分类的应用场合,如金融趋势预测、语音识别等领域。通过学习本文提供的完整流程,读者可以掌握如何利用ESN解决实际问题,并能够根据自身需求调整模型参数以获得更好的性能。 其他说明:文中不仅给出了完整的Matlab代码示例,而且针对每一环节进行了详细的解释,帮助读者更好地理解ESN的工作原理和技术细节。同时提醒读者注意某些关键参数的调节范围,以便于在实际项目中取得理想的效果。

    威纶通触摸屏一机多屏程序

    内容概要:本文深入介绍了威纶通触摸屏一机多屏程序及其与FX3U系列PLC和MODBUS通讯的集成应用。首先,文章阐述了系统的硬件架构,即一个FX3U系列PLC搭配四个MT6051ip触摸屏的工作原理。接着,详细解析了威纶通模板的特点,特别是梯形图的详尽注释,便于理解和维护。此外,文章还探讨了PLC与上位机的MODBUS通讯设置,包括波特率、数据位、停止位等参数的具体配置方法。最后,强调了该系统的学习意义和借鉴价值,适用于新手和资深工程师。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是那些希望深入了解PLC、触摸屏和MODBUS通讯的人群。 使用场景及目标:①帮助工程师快速掌握威纶通触摸屏的一机多屏配置;②提高PLC与触摸屏、上位机之间的通讯效率;③优化中小型企业生产线的监控系统,提升生产效率和稳定性。 其他说明:文中提供的实例和代码片段有助于读者更好地理解和实践相关技术,同时附带了一些实用的小技巧,如心跳检测和双看门狗设计,增强了系统的可靠性和容错能力。

    无人机航测_大疆航线规划_KMZ文件生成与解析_基于JavaXStream注解的DJIPilot2兼容航线文件处理工具_支持航点飞行建图航拍等多种任务模板_包含航线高度速度航向角失.zip

    无人机航测_大疆航线规划_KMZ文件生成与解析_基于JavaXStream注解的DJIPilot2兼容航线文件处理工具_支持航点飞行建图航拍等多种任务模板_包含航线高度速度航向角失

    Matlab蒙特卡洛模拟求解复杂模型可靠度近似解

    内容概要:本文详细介绍了蒙特卡洛方法在工程可靠度计算中的应用,特别是在处理涉及多种概率分布参数的情况下。首先展示了基本的Matlab实现,如生成正态分布和极值分布的随机样本,并通过极限状态函数判断结构的安全性。接着讨论了处理相关变量的有效方法——拉丁超立方抽样,以及进一步提高计算效率的重要抽样法。此外,还探讨了并行计算和置信区间的计算,确保结果的准确性。最后强调了蒙特卡洛方法在解决复杂可靠度问题中的优越性和实用性。 适合人群:从事工程可靠度分析的研究人员和技术人员,以及对数值模拟感兴趣的工程师。 使用场景及目标:适用于需要评估结构或其他系统的可靠性的场合,尤其是在无法获得解析解的情况下。目标是提供一种简单有效的数值方法来估算失效概率和可靠度。 其他说明:文中提供了大量具体的Matlab代码示例,帮助读者更好地理解和应用蒙特卡洛方法。同时提醒使用者注意计算资源的合理分配,以平衡精度和效率。

    人力资源管理系统 - Java课程设计 - 毕业设计 - 期末大作业 - SpringBoot+Vue项目 - 初学者实战

    基于SpringBoot+MyBatisPlus+Vue+MySQL的人力资源管理系统,专为Java课程设计、毕业设计及期末大作业打造。采用主流技术栈(Idea开发),适合Java初学者快速上手,提供完整源码与文档,助力高效完成学习任务!

    Screenshot_2025-01-26-01-50-08-41.jpg

    Screenshot_2025-01-26-01-50-08-41.jpg

Global site tag (gtag.js) - Google Analytics