将受保护的成员公开为 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
(恕我直言,最后一个很奇怪)。
我有一个特征,代表某个模块公开了一些 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
(恕我直言,最后一个很奇怪)。