我有一套component interfaces套的
interface ITest<I> {
operator fun invoke(p: I)
}
interface OTest<O> {
operator fun invoke(): O
}
interface IOTest<I, O> {
operator fun invoke(p: I): O
}
以及相应的functional interface
interface TestAdder<T> {
fun add_f(p: T) {} //default impl
}
继承以将上面的组件添加到相应的(functional) collection interfaces
interface ITestSet<I> : TestAdder<ITest<I>> {
val i_v: I
fun i_f1(p: I) {} // default impl
fun i_f2(p: I) {} // default impl
fun i_f3(p: I) {} // default impl
}
interface OTestSet<O> : TestAdder<OTest<O>> {
val o_v: O
fun o_f1(p: O) {} // default impl
fun o_f2(p: O) {} // default impl
fun o_f3(p: O) {} // default impl
}
interface IOTestSet<I, O> : TestAdder<IOTest<I, O>> {
val i_v: I
val o_v: O
// same as ITestSet<I>
fun i_f1(p: I) {} // default impl
fun i_f2(p: I) {} // default impl
fun i_f3(p: I) {} // default impl
// same as OTestSet<O>
fun o_f1(p: O) {} // default impl
fun o_f2(p: O) {} // default impl
fun o_f3(p: O) {} // default impl
fun io_f1(p: I): O
...
}
到目前为止,还没有必要:理想情况下,IOTestSet<I, O>
应该继承ITestSet<I>
和OTestSet<O>
中定义的功能:
interface IOTestSet<I, O> : ITestSet<I>, OTestSet<O>, TestAdder<IOTest<I, O>> {
fun io_f1(p: I): O
...
}
但显然,TestAdder<T>
interface在继承链中引入了不一致.
This smells like an age-old, archetypal paradigm (and probably even an XY) problem, still it seems I have to ask:个