我正在扩展一个抽象类,它在其构造函数中定义了一个隐式参数。
似乎有 3 种不同的方法可以做到这一点:
abstract class Base(z: ZType)(implicit a: AType)
// Explicit
class First(z: ZType, a: Atype) extends Base(z)(a)
// Explicitly pass a into the child class which
// implicitly passes it into the parent class
class Second(z: ZType, implicit val a: AType) extends Base(z)
// Implicitly passed into both
class Third(z: ZType)(implicit a: AType) extends Base(z)
Run Code Online (Sandbox Code Playgroud)
也许这取决于将如何使用子类。就我而言,子类不会有隐含AType的作用域,所以我倾向于第二种选择。
我对第二个选项最大的担忧是,我现在为同一类型定义了 2 个隐式,一个在父类中,一个在子类中。由于它们始终是同一个对象,这有什么影响吗?出于任何原因,我应该避免第二种模式吗?
基本上,这里是否有“正确”的模式,或者所有这些都可以接受,具体取决于它们所使用的代码的上下文?
Second如果您认为任何用户通常都希望隐式传递,则选项 3 是最好的选择a。他们总是可以走明确的路线,但你只是让它变得更困难一点,而且非常明确。我认为这很好,这确实是最常见的模式。
如果您不控制Base定义方式,并且您希望用户在每种情况下始终显式传递,则选项 1 是正确的选择a。
选项 2 从来都没有什么好处,因为你永远不能以a这种方式隐式传递,而且它比选项 1 读起来更混乱。请注意,以下内容无法编译。
implicit val a: AType = ???
val z: Type = ???
new Second(z)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |