我正在设计一个类层次结构,包括一个基类和一些特征。基类提供了几种方法的默认实现,而特征通过
从设计角度来看,这很有效,并且将过滤函数(一个特征)与谓词(另一个特征)等组合起来,可以映射到域。
但现在我希望我的一些特征使用隐式参数。从设计角度来看,这仍然是有意义的,实际上不会引起困惑。但是,我无法让编译器运行它。
问题的核心似乎是我无法为特征提供构造函数参数,使它们可以标记为隐式参数。在方法实现中引用隐式参数会导致编译器无法找到隐式值的预期错误消息;我尝试将隐式参数从构建阶段(在实践中,它始终在作用域内)“传递”到方法中,以使其可用。
abstract override
有选择地覆盖某些方法,以充当可堆叠的特征/混合物。从设计角度来看,这很有效,并且将过滤函数(一个特征)与谓词(另一个特征)等组合起来,可以映射到域。
但现在我希望我的一些特征使用隐式参数。从设计角度来看,这仍然是有意义的,实际上不会引起困惑。但是,我无法让编译器运行它。
问题的核心似乎是我无法为特征提供构造函数参数,使它们可以标记为隐式参数。在方法实现中引用隐式参数会导致编译器无法找到隐式值的预期错误消息;我尝试将隐式参数从构建阶段(在实践中,它始终在作用域内)“传递”到方法中,以使其可用。
implicit val e = implicitly[ClassName]
但是(正如你们中的许多人所期望的那样),那个定义也以相同的信息失败了。
这里的问题似乎在于我无法说服编译器使用 implicit ClassName
标记特质本身的签名,并强制调用者(即将特质混入对象的人)提供 implicit。目前我的调用者 正在 这样做,但编译器并未在此级别上检查。
有没有办法将一个特质标记为要求在构建时可用某些隐式值?
(如果没有,那么这只是尚未实现还是有更深层次的原因使其不切实际?)
implWrap
吗?因为它是trait中的一个抽象字段。(如果不是,我不明白它是如何设置的;您能解释一下吗?) - Andrzej Doyleval implWrap = ClassNameW
。我没有看到更好的方法来做到这一点:正如您在问题中提到的那样,traits根本没有任何构造函数参数(可以标记为implicit)。 - Alexey Romanov