- 浏览: 70497 次
- 性别:
- 来自: 北京
-
最新评论
-
sunnyfaint:
做为读者,我只要看到好文章,谁写的没关系。版权是作者要关心的事 ...
写过东西的人都知道,内容决定形式啊 -
okjacky:
不错很好东西 楼主奉献和学究的思想值得学习。
大型企业信息系统架构设计——完整图文整理稿 -
tuti:
给做企业系统的朋友,推荐一下这本书
《仍然不足够》(Nece ...
大型企业信息系统的架构设计-SD2C-2009 -
liuyf:
有收获,谢谢
大型企业信息系统的架构设计-SD2C-2009 -
liuhong2099:
35美圆可以买 Myeclipes了 不过 我们还是喜欢 Ec ...
捐款庆祝eclipse helios发布
成员(Membership )
如前所示,Iter 类从StringIterator 和RichIterator 同时继承了类成员(members )。简单而言,一个类从以混入合成方式继承Cn with … with C1 ,将会继承其中所有类的成员,同时还可以自定义新的成员。由于Scala 保留了Java 和C# 的静态重载机制,因此可能从父类继承同名的方法,也可以再定义同名的方法[1] 。为了判断类C 的一个方法到底是覆盖父类中的同名方法,还是这两个方法并存——即重载的关系,Scala 采用了匹配(matching )法,这也是从Java 和C# 中类似的概念衍生来的:简单地说,如果两个类成员同名,并且具有相同的参数类型(如果两个都是方法),就称之为相匹配。
一个类的成员总共两种类型:具体和抽象的,每种类型分别对应一个判定规则:(注:下面几段是说明Scala 语言判断类成员属性的内部机制,不关心这方面细节的可以忽略)
一个类C 的具体成员是指其或其父类的所有具体声明M ,除非在其某个父类(也就是在L(C) )中已有一个匹配的具体成员。
一个类C 的抽象成员是指其或其父类的所有抽象声明M ,除非在C 中已有一个匹配的具体成员,或者其某个父类(也就是在L(C) )中有一个匹配的抽象成员。
这些规则同样决定了一个类C 与其父类之间匹配成员的覆盖关系。首先,具体成员一定覆盖抽象成员。其次,如果M 和M’ 同为具体成员或抽象成员,且M 在C 的全序化当中出现在M’ 之前,则M 覆盖M’ 。
父类调用(Super Calls )
我们考虑设计一个同步迭代器,也就是其操作在多线程之间是互斥的。
trait SyncIterator[T] extends AbsIterator[T] {
abstract override def hasNext: boolean =
synchronized(super .hasNext)
abstract override def next: T =
synchronized(super .next)
}
想要构造一个针对String 的Rich 、同步迭代器,可以用这三个类进行合成:
StringIterator(someString) with RichIterator[char]
with SyncIterator[char]
这个合成类从SynchIterator 继承了hasNext 和Next ,这两个方法都是对其父类的相应方法调用加了一个sychronized() 包装。
由于RichIterator 和SyncIterator 定义的方法相互不重合(注:原文是RichIterator 和StringIterator ,应该有误),因此它们出现在mixin 中的顺序没有影响,即上例写成这样也是等价的:
StringIterator(someString) with SyncIterator[char]
with RichIterator[char]
但是,这里有一个小细节要注意:在SyncIterator 中的super 这个调用并不是静态地绑定到其父类AbsIterator 上,因为显然这是毫无意义的,AbsIterator 定义的next 和hasNext 都是抽象方法。实际上,这个super 调用实际上指向这个mixin 合成中的superclass :StringIterator 的相应方法。从这个意义上讲,一个mixin 合成的superclass 覆盖了其各个mixin 当中静态声明的超类。这也就意味着super 调用在一个类当中无法被静态解析,必须延迟到一个类被实例化或被继承的时候才能解析出来。这一概念有如下精确定义:
假设C 是D 的父类,在C 当中的表达式super .M 应该能够静态解析为C 的某个父类当中的成员M ,这样才能保证类型正确。而在D 的语境中(context ,我将其翻译为语境,而不是通常人们翻译的“上下文”。这个问题说来话长,有机会的话会变成一篇文章甚至一本书——译者在这里顺便贩卖一下私货),这个表达式应该表示一个与M 相匹配的M’ ,这个成员应该在D 的全序当中位于C 之后的某个类里定义。
最后注意一点:在Java 或C# 等语言中,上述SyncIterator 当中的这种super 调用明显是不合法的,因为它会被指派为父类当中的抽象成员(方法)。如同我们在上面看到的,这种构造在scala 中是合法的,只要保证一个前提,那就是这个类所出现的语境当中,其super 调用所访问的父类成员必须是具体定义了的。这一点是由SyncIterator 当中的abstract 和override 这两个关键字保证的。在scala 中,abstract override 这两个关键字成对出现在方法定义中,表明这个方法并没有获得完全的定义,因为它覆盖(并使用)了其父类当中的抽象成员。一个类如果有非完整定义的成员,它自身必须是抽象类,其子类必须将这些非完整定义的成员重新定义,才能进行实例化。
对 super 的调用可以是级联的,因此要遵从类的全序化(这是 Scala 的混入合成方式与多重继承方式之间最主要的差异)。例如,考虑另一个与 SyncIterator 类似的类,它将其返回的每个元素都打印到标准输出上:
trait LoggedIterator[T] extends AbsIterator[T] {
abstract override def next: T = {
val x = super .next; System.out.println(x); x
}
}
我们可以将这两种迭代子( sychronized 和 logged )通过 mixin 组合在一起:
class Iter2 extends StringIterator(someString)
with SyncIterator[char]
with LoggedIterator[char]
在这里, Iter2 的全序化是:
{ Iter2, LoggedIterator, SyncIterator,
StringIterator, AbsIterator, AnyRef, Any }
这样一来, Iter2 的 next 方法继承自 LoggedIterator ,而该方法中的 super.next 则指向 SyncIterator 的 next 方法,而后者当中的 super.next 则最终引用 StringIterator 的 next 方法。
如果想对记录日志的动作进行同步,仅需要把两个 mixin 的顺序反过来即可实现:
class Iter2 extends StringIterator(someString)
with LoggedIterator[char]
with SyncIterator[char]
无论哪种情况, Iter2 的 next 方法当中 super 的调用都遵循其全序当中的父类顺序。
评论
不知道martin引入self type和super的初衷是为了解决什么问题?
感觉用了self type和super以后,this和super的使用很不确定;不是很直观,有些难以理解
好在Scala对方法本身的静态类型定义和检查,在IDE中,你可以Mouse over或Click调用的方法名,马上得知哪个方法被引用。
对Trait的使用,目前还需要更多的实际应用来判断适合的情景。以我观察Martin本人在Scala的API编程中,trait首先被当作Java中的interface使用,其次,在compiler库中,大部分情况下,trait中很少包含方法,而是被用做mixin class/object的容器,就是说,包含的是子类和Object。
嗯,没错,其实这个问题我表达的不太精确,应当主要是针对trait的。我这两句话一起说,就是针对文章当中这个例子。可以看到在trait当中如果还要包含super.XXX这类逻辑,在trait本身的design time是无法知道super的具体引用的,反之他被如何继承也无法知晓。因此是否应该在trait当中包含这样的逻辑,或者说具体应该包含什么逻辑,是存在着最佳实践的概念的,也就是还需要实践和摸索。
这就是我后面的担忧中说的问题了,语言的设计者固然可以有这样的初衷或者(头脑中隐含的)限制,但是对于使用者而言,要他们时刻想着“应该在构建组件时使用一些复杂手段,解决普通编程需要时使用一些内建的便捷特性”,很容易造成一定程度的困惑,最终会导致这种语言的使用者被人为地(其实是自然地)划分为不同的群体,无法构成一个非常良好的社区。在我看来C++的现状就是这样形成的,对于语言的设计者而言有种悲哀的味道。
好在Scala对方法本身的静态类型定义和检查,在IDE中,你可以Mouse over或Click调用的方法名,马上得知哪个方法被引用。
对Trait的使用,目前还需要更多的实际应用来判断适合的情景。以我观察Martin本人在Scala的API编程中,trait首先被当作Java中的interface使用,其次,在compiler库中,大部分情况下,trait中很少包含方法,而是被用做mixin class/object的容器,就是说,包含的是子类和Object。
当然,我们首先强调,复杂的手段应该主要由API的设计者使用。
我感觉这样的一个语法体系,其利弊尚难准确评判。举个例子而言:Scala中的继承这一概念,完全超出了直观的范畴,全序的引入固然使之在语法上的精确性得到保证,但对于编程者而言,在某些时刻如果不计算出全序的结果,甚至不知道到底继承了哪个方法。反之,你写下一个可以被继承的方法时,甚至可能要考虑到如何被人继承才有更好效果/更不容易出现问题。
不仅如此,scala的语法在不同的角度/维度体现出的特性,也存在着隐忧。比如说其scriptable的性质,也是很为martin所“炫耀”,但与前述这些对象体系并没有什么特别必然的内在联系。这不由得让我想起了BS所宣扬的C++的宗旨:multi paradigm programming,而C++的现状,也皆源于此。这样看起来,scala快要变成VM模型下的C++了,其前景也因此变得难于预测。
发表评论
-
4 操作也是对象(Operations Are Objects)
2015-01-21 18:56 04 操作也是对象(Operations Are Obje ... -
Scala概述(六)合成(3.总结)
2012-07-15 02:00 1423面向服务的组件模型(Service-Oriented Comp ... -
Scala概述(六)合成
2009-06-28 19:49 14706. 合成(composition) 解释了 ... -
Scala概述(五)抽象(3)
2009-03-13 20:24 11565.3 用抽象类型建立泛型 ... -
Scala概述(五)抽象(2.3)
2008-12-31 17:04 1571族多态和self类型(Family polymorphism ... -
Scala概述(五)抽象(2.1、2.2)
2008-12-22 22:33 1117路径依赖类型(Path-depen ... -
Scala概述(五)抽象(2)
2008-12-22 22:00 10745.2 抽象成员(Abstraction Members ... -
Scala概述(五)抽象(1.3、1.4)
2008-11-04 22:48 1181二元操作和参数下界(B ... -
Scala概述(五)抽象(1.1、1.2)
2008-11-02 11:52 1462参数限定(Parameter bounds)考虑这样一个方法: ... -
Scala概述(五)抽象(1)
2008-10-30 23:02 11885. 抽象(Abstraction) 在组件系统中 ... -
Scala概述(四)操作也是对象(4、5)
2008-10-21 21:52 13134.4. 序列(Sequences) 高阶函数的使用是序列处 ... -
Scala概述(四)操作也是对象(2、3)
2008-10-06 13:12 16074.2. 函数也是对象(Functions are Ob ... -
Scala概述(四)操作也是对象(1)
2008-09-28 22:40 12534. 操作也是对 ... -
Scala概述(三)统一的对象模型(3)
2008-09-26 12:51 12403.3. 变量和属性(Variables and Pro ... -
Scala概述(三)统一的对象模型(2)续
2008-09-25 00:04 1100某些Scala的操作符并不总对所有参数求值,例如标准布尔操作符 ... -
Scala概述(三)统一的对象模型(2)
2008-09-24 23:58 13643.2. 操作(Operations) Scala统一对 ... -
Scala概述(三)统一的对象模型(1)
2008-09-22 23:52 18513. 统一的对象模型 Scala采用了一种纯粹的面 ... -
Scala概述(二)一种类似Java的语言
2008-09-21 12:54 23252. 一种类似 Java 的语言 Scala ... -
Scala概述(一)简介
2008-09-19 16:43 3057摘要 Scala 是一种融合了面向对象和函数式编程的静态类型 ... -
Scala概述(译序)
2008-09-19 16:39 1248Scala概述(An Overview of the Scal ...
相关推荐
微米级模块化波形合成器功能列表音高转换在线性比率和对数比率之间转换在自定义...Scala(scl和kbm)格式创建调整图/应用实时调整有限的调整支持增强合成器的功能提前调谐多个频道或及时调谐单个频道如果根本不支持MTS...
概述 Muse可以从纯文本中合成时尚的英语手写内容。 它的算法仔细连接相邻字符的笔触以创建草书单词,并使用随机扰动来确保每个字符在渲染结果中都是唯一的。 下图显示了一些打印在纸上的渲染文本: 您可以通过上的...
随着技术的发展,PBE已经开始支持多种编程语言,如Scala、R、PySpark等,这为程序员提供了更灵活的选择。 #### 4.3 集成现有工作流程 PBE技术正逐步集成到现有的开发工具和环境中,如IDE(Integrated Development ...
哈希表源码
sun_3ck_03_0119
内容概要:本文档详细介绍了基于 MATLAB 实现的 LSTM-AdaBoost 时间序列预测模型,涵盖项目背景、目标、挑战、特点、应用领域以及模型架构和代码示例。随着大数据和AI的发展,时间序列预测变得至关重要。传统方法如 ARIMA 在复杂非线性序列中表现欠佳,因此引入了 LSTM 来捕捉长期依赖性。但 LSTM 存在易陷局部最优、对噪声鲁棒性差的问题,故加入 AdaBoost 提高模型准确性和鲁棒性。两者结合能更好应对非线性和长期依赖的数据,提供更稳定的预测。项目还展示了如何在 MATLAB 中具体实现模型的各个环节。 适用人群:对时间序列预测感兴趣的开发者、研究人员及学生,特别是有一定 MATLAB 编程经验和熟悉深度学习或机器学习基础知识的人群。 使用场景及目标:①适用于金融市场价格预测、气象预报、工业生产故障检测等多种需要时间序列分析的场合;②帮助使用者理解并掌握将LSTM与AdaBoost结合的实现细节及其在提高预测精度和抗噪方面的优势。 其他说明:尽管该模型有诸多优点,但仍存在训练时间长、计算成本高等挑战。文中提及通过优化数据预处理、调整超参数等方式改进性能。同时给出了完整的MATLAB代码实现,便于学习与复现。
1996-2019年各地级市平均工资数据 1、时间:1996-2019年 2、来源:城市nj、各地级市统计j 3、指标:平均工资(在岗职工) 4、范围:295个地级市
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
内容概要:本文介绍了一种新颖的变压器模型C2Former(Calibrated and Complementary Transformer),专门用于解决RGB图像和红外图像之间的物体检测难题。传统方法在进行多模态融合时面临两个主要问题——模态错位(Modality miscalibration)和融合不准确(fusion imprecision)。作者针对这两个问题提出采用互模交叉注意力模块(Inter-modality Cross-Attention, ICA)以及自适应特征采样模块(Adaptive Feature Sampling, AFS)来改善。具体来说,ICA可以获取对齐并且互补的特性,在特征层面进行更好的整合;而AFS则减少了计算成本。通过实验验证了基于C2Former的一阶段和二阶段检测器均能在现有公开数据集上达到最先进的表现。 适合人群:计算机视觉领域的研究人员和技术人员,特别是从事跨模态目标检测的研究人员,对Transformer架构有一定了解的开发者。 使用场景及目标:适用于需要将可见光和热成像传感器相结合的应用场合,例如全天候的视频监控系统、无人驾驶汽车、无人
上海人工智能实验室:金融大模型应用评测报告-摘要版2024.pdf
malpass_02_0907
C++-自制学习辅助工具
内容概要:本文提供了有关微信生态系统的综合开发指导,具体涵盖了微信机器人的Java与Python开发、全套及特定应用的小程序源码(PHP后台、DeepSeek集成),以及微信公众号的基础开发与智能集成方法。文中不仅给出了各种应用的具体案例和技术要点如图灵API对接、DeepSeek大模型接入等的简述,还指出了相关资源链接以便深度探究或直接获取源码进行开发。 适合人群:有意开发微信应用程序或提升相应技能的技术爱好者和专业人士。不论是初涉者寻求基本理解和操作流程,还是进阶者期望利用提供的资源进行项目构建或是研究。 使用场景及目标:开发者能够根据自身兴趣选择不同方向深入学习微信平台的应用创建,如社交自动化(机器人)、移动互联网服务交付(小程序),或者公众信息服务(公众号)。特别是想要尝试引入AI能力到应用中的人士,文中介绍的内容非常有价值。 其他说明:文中提及的多个项目都涉及到了最新技术栈(如DeepSeek大模型),并且为不同层次的学习者提供从零开始的详细资料。对于那些想要迅速获得成果同时深入了解背后原理的人来说是个很好的起点。
pimpinella_3cd_01_0916
mellitz_3cd_01_0516
schube_3cd_01_0118
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
智慧用电平台建设解决方案【28页】