scala – 如何使用子特征定义特征,以便他们的方法只采用共享实现
发布时间:2020-12-16 09:59:20 所属栏目:安全 来源:网络整理
导读:我的元问题是“如何清晰地问这个问题?”但也许一个例子可以让它更清晰: trait Toolbox { trait Bolt trait Wrench { def tighten(b : Bolt) } def getWrench : Wrench def getBolt : Bolt}object MetricToolbox extends Toolbox {...}object EnglishToolbo
我的元问题是“如何清晰地问这个问题?”但也许一个例子可以让它更清晰:
trait Toolbox { trait Bolt trait Wrench { def tighten(b : Bolt) } def getWrench : Wrench def getBolt : Bolt } object MetricToolbox extends Toolbox { ... } object EnglishToolbox extends Toolbox { ... } 当然,公制扳手只能拧紧公制螺栓;同上英文工具箱中的工具.我的问题是,我如何以类型安全的方式表达它,以便以下不会编译: MetricToolbox.getWrench tighten EnglishToolbox.getBolt 但以下将: def doTighten(box : Toolbox) = box.getWrench tighten box.getBolt 我知道这是可能的,因为我听说马丁奥德斯基昨晚在斯卡拉聚会上用自己的嘴说出来但是在那一刻,我的妻子打电话给我的牢房,在他解释之前我不得不赶紧离开房间. 编辑didierd指出我的代码是按照书面编写的.他是对的 – 我对细节有点不清楚但确实如此.自然的反向问题是,我怎么不这样做?答案很简单:将这些类放在与主要特征相同的级别. trait Nail trait Hammer { def pound(n : Nail) } trait Toolbox { trait Bolt trait Wrench { def tighten(b : Bolt) } def getWrench : Wrench def getBolt : Bolt def getNail : Nail def getHammer : Hammer } MetricToolbox.getHammer pound EnglishToolbox.getNail // this DOES compile 解决方法
如上所述,它已经有效了.当Bolt和Wrench嵌套在Toolbox中时,键入拧紧参数的Bolt意味着这个精确工具箱的Bolt,而不是任何工具箱的Bolt.它们分别写成了一些工具箱.Bolt,这意味着一个确实实例的博特someToolBox和工具箱#Bolt,这意味着工具箱中定义的Bolt,无论是什么工具箱.所以Toolbox#Bolt是所有x.Bolt的常见超类型.
没有资格的Bolt意味着这个.Bolt,这是封闭的工具箱.所以你不能混. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |