我正在尝试对我的接口进行 Facade 以抽象真实类型并省略直接命名所有类型的需要。我结束了这个:
class Facade : ILeft by LeftImpl(), IRight by RightImpl()
ILeft和IRight是接口,我实例化它们的实现。这是我一直在寻找的一般解决方案,并且有效。
但
比方说,我知道,我大部分时间只会使用 ILeft 或 IRight。在某些情况下,我会同时使用它们,但大多数情况下,我只会使用一种。因此我想让他们变得懒惰,但是如何呢?
1) 可以使用构造函数中提供的实例,但这需要一个实例。
2)如果我尝试定义:
class Facade : ILeft by left, IRight by right {
val left by lazy { LeftImpl() }
val right by lazy { RightImpl() }
}
Run Code Online (Sandbox Code Playgroud)
该left和right在类的声明无法访问。
我可以在内部使实现变得懒惰,这也是一种可能性。但是我正在尝试找到一种方法,仅通过 kotlin 就可以开箱即用地编写它。
任何想法如何让只有 ILeft 的 Facade 对象通过实现实际初始化?
Kotlin 目前不支持通过将接口委托给属性(KT-83)来实现接口,在委托中使用的表达式中只能使用构造函数参数,并且这些表达式始终在构造时进行评估。
因此,实际上,您可能需要为接口定义惰性代理实现:
class ILeftLazy(lazyLeft: Lazy<ILeft>): ILeft {
private val left by lazyLeft
override fun someLeftFun(): Foo = left.someLeftFun()
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以重写Facade主构造函数以接受Lazy实例并通过将接口委托给实现来实现接口:
class Facade(
lazyLeft: Lazy<ILeft>
lazyRight: Lazy<IRight>
) : ILeft by ILeftLazy(lazyLeft), IRight by IRightLazy(lazyRight) {
val left by lazyLeft
val right by lazyRight
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以创建主构造函数private并提供一个无参数的辅助构造函数,该构造函数将lazy { ILeftImpl() }和传递lazy { IRightImpl() }给主要构造函数。
这需要一些实现惰性代理实现的样板,但仍然允许您Facade通过委托实现接口。
| 归档时间: |
|
| 查看次数: |
898 次 |
| 最近记录: |