Scala概述(五)抽象(2.3)

本文介绍Scala中的族多态和self类型概念,通过发布/订阅模式的实现,展示了如何利用抽象类型来描述相互协变的一组类型,并解释了self类型在确保类型正确性中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

族多态和self类型(Family polymorphism and self types.Scala的抽象类型概念非常适合于描述相互之间协变的一族(families)类型,这种概念称作族多态。例如:考虑发布/订阅模式,它有两个主要类型:subjectsobserversSubjects定义了subscribe方法,用于给observers进行注册,同时还有一个publish方法,用于通知所有的注册者;通知是通过调用所有注册者的notify方法实现的。一般来说,当subject的状态发生改变时,会调用publish方法。一个subject可以有多个observers,一个observer也可以观察多个subjectSubscribe方法一般用observer的标识为参数,而notify方法则以发出通知的subject对象为参数。因此,这两个类型在方法签名中都引用到了对方。

这个模式的所有要素都在如下系统中:

abstract class SubjectObserver {

type S <: Subject

type O <: Observer

abstract class Subject requires S {

private var observers: List[O] = List()

def subscribe(obs: O) =

observers = obs :: observers

def publish =

for (val obs <- observers) obs.notify(this)

}

 

trait Observer {

def notify(sub: S): unit

}

}

顶层的SubjectObserver类包含两个类成员:一个用于subject,一个用于observerSubject类定义了subscribe方法和publish方法,并且维护一个所有注册的observer的列表。Observer这个trait只定义了一个抽象方法notify

需要注意的是,SubjectObserver并没有直接引用对方,因为这种“硬”引用将会影响客户代码对这些类进行协变的扩展。相反,SubjectOberver定义了两个抽象类型SO,分别以SubjectObserver作为上界。Subjectobserver的类型分别通过这两个抽象类型引用对方。

另外还要注意,Subject类使用了一个特殊的标注requires

abstract class Subject requires S { ...

这个标注表示Subject类只能作为S的某个子类被实例化,这里S被称作Subjectself-type。在定义一个类的时候,如果指定了self-type,则这个类定义中出现的所有this都被认为属于这个self-type类型,否则被认为是这个类本身。在Subject类中,必须将self-type指定为S,才能保证obs.notify(this)调用类型正确。

Self-type可以是任意类型,并不一定与当前正在定义的类型相关。依靠如下两个约束,类型正确性仍然可以得到保证:(1)一个类型的self-type必须是其所有父类型的子类,(2)当使用new 对一个类进行实例化时,编译器将检查其self-type必须是这个类的父类。

这个publish/subscribe模式中所定义的机制可以通过继承SubjectObserver,并定义应用相关的SubjectObserver类来使用。例如下面的SensorReader对象,将传感器(sensors)作为subjects,而将显示器(displays)作为observers

object SensorReader extends SubjectObserver {

type S = Sensor

type O = Display

abstract class Sensor extends Subject {

val label: String

var value: double = 0.0

def changeValue(v: double) = {

value = v

publish

}

}

 

class Display extends Observer {

def println(s: String) = ...

def notify(sub: Sensor) =

println(sub.label + " has value " + sub.value)

}

}

在这个对象中,SSensor限定,而ODisplay限定,从而原先的两个抽象类型现在分别通过覆盖而获得定义,这种“系绳节”(“tying the knot”)在创建对象实例的时候是必须的。当然,用户也可以再定义一个抽象的SensorReader类型,未来再通过继承进行实例化。此时,这两个抽象类型也可以通过抽象类型来覆盖,如:

class AbsSensorReader extends SubjectObserver {

type S <: Sensor

type O <: Display

...

}

下面的代码演示了SensorReader如何使用:

object Test {

import SensorReader._

val s1 = new Sensor { val label = "sensor1" }

val s2 = new Sensor { val label = "sensor2" }

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

val d1 = new Display; val d2 = new Display

s1.subscribe(d1); s1.subscribe(d2)

s2.subscribe(d1)

s1.changeValue(2); s2.changeValue(3)

}

}

另外值得注意的是其中的import语句,它使Test可以直接访问SensorReader的成员,而无需前缀。ScalaImportJava中用法更广泛,可以在任何地方使用,可以从任何对象中导入成员,而不仅仅从一个package中。

内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
资 源 简 介 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系, 详 情 说 明 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。 本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系,在此基础上重点分析了一种快速ICA实现算法一FastICA。物质的非线性荧光谱信号可以看成是由多个相互独立的源信号组合成的混合信号,而这些独立的源信号可以看成是光谱的特征信号。为了更好的了解光谱信号的特征,本文利用独立分量分析的思想和方法,提出了利用FastICA算法提取光谱信号的特征的方案,并进行了详细的仿真实验。 此外,我们还进行了进一步的研究,探索了其他可能的ICA应用领域,如音乐信号处理、图像处理以及金融数据分析等。通过在这些领域中的实验和应用,我们发现ICA在提取信号特征、降噪和信号分离等方面具有广泛的潜力和应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值