我正在设计一个类层次结构,它由一个基类和几个特征组成。基类提供了几种方法的默认实现,并且这些特征通过abstract override
有选择地覆盖某些方法,以充当可堆叠特征/混合。如何将特征声明为隐式“构造函数参数”?
从设计的角度来看,这工作得很好,并映射到域,这样我可以从这里(一个特征)与谓词从这里(另一个特征)等
增加过滤功能。然而,现在我我喜欢我的一些特征来获取隐式参数。我很高兴这从设计的角度来看仍然有意义,并且在实践中不会令人困惑。但是,我无法说服编译器运行它。
问题的核心似乎是我无法为特征提供构造函数参数,因此它们可能被标记为隐式。在方法实现中引用隐式参数时,无法编译期望的“找不到隐式值”消息;我试图通过
implicit val e = implicitly[ClassName]
到“传播”从施工阶段(其中,在实践中,它总是在范围内)的隐含的是在方法中可用,但(因为毫无疑问,你们许多人期望的那样)该定义以相同的讯息失败。
看来这里的问题是我不能说服编译器用implicit ClassName
标志标记特征本身的签名,并强制调用者(即那些将特征混合到对象中的调用者)提供隐式。目前我的呼叫者是这样做,但编译器不检查此级别。
有没有什么办法来标记性状为需要一定implicits可在施工时间?
(如果没有的话,就是这根本尚未实现,还是有更深层次的原因,这是不切实际的?)
这是不是让调用者明确定义'implWrap'虽然在匿名对象中,因为它是特征中的抽象字段? (如果没有,我不明白它是如何设置的;你介意解释一下吗?) –
是的,但看到注释:如果他想使用隐式,他可以只写'val implWrap = ClassNameW'。我没有看到一个更好的方法来做到这一点:正如你在问题中提到的,特征没有_any_构造函数参数(可能被标记为隐含的)。 –
当然,我会很高兴看到更好的解决方案。 –