将受保护的成员公开为 public 与自我类型

Expose protected member as public with self tyes

我有一个特征,代表某个模块公开了一些 public 方法(想想服务):

trait X { 
  def exposeMe: AService = ...
  def keepMeHidden: BService = ...
}

然后,我有一个 Y 模块需要来自 X 的服务。 Y 的客户还需要 X 的一项服务。但我不希望他们依赖于整个 X,只依赖于这一项服务。我想 "export" 那一项服务是 public.

trait Y { this: X => 
  def exposeMe2: AService = exposeMe
}

这行得通,但是有没有办法让方法名称保持不变?

简答:

trait X { 
  def exposeMe: Int = 12
  def keepMeHidden: Int = 41
}

trait XComponent {
  def x: X
}

trait Y { this: XComponent => 
  def exposeMe: Int = x.exposeMe
}

问题编辑后更新。

问题是你烤了一半蛋糕,然后想从这个复杂的组件中提取一层。正确的方法是要求你真正需要的东西:

trait Y { this: AServiceComp => 
  def exposeMe: AService = aService.exposeMe
}

其中 AServiceComp 实现可以通过单个 AService 实现或使用 new XImpl.exposeMe(恕我直言,最后一个很奇怪)。