首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin追溯应用接口

Kotlin追溯应用接口
EN

Stack Overflow用户
提问于 2021-05-25 14:01:06
回答 1查看 40关注 0票数 0

kotlin中是否有一种方法可以追溯应用接口或具有类似的函数/类型。

我使用生成器生成多个类。生成器不允许声明这些类实现的接口。相反,它们都实现了相同的功能。让我们调用类A、B和C,A、B和C都有名为f1、f2和f3的函数,但它们是单独实现的,不是接口实现的结果。

现在,我想将一个函数声明为一个参数,它的类型类似于接口,它适合A、B和C,并且能够使用f2和f3。我在Kotlin网站上看到了一个与这个问题相似的问题,但是找不到像这样的东西。显然,Go可以做这样的事情。虽然它的形式有点奇怪,而且没有使用close函数,但是它可能没有确切地显示我在这里想要做的事情。

我寻找这样的东西:

代码语言:javascript
复制
class A {
   fun f1 (string: String) {}
   fun f2 (int: Int) {}
   fun f3 () {}
}

class B {
   fun f1 (string: String) {}
   fun f2 (int: Int) {}
   fun f3 () {}
}

class C {
   fun f1 (string: String) {}
   fun f2 (int: Int) {}
   fun f3 () {}
}

请再次注意:这两个类都没有接口实现。

我想要一个对他们都有用的函数。就像这样:

代码语言:javascript
复制
typeContract CollectiveABC {
   fun collectiveF2 (int: Int) {}
   fun collectiveF3 () {}
}

或者这个

代码语言:javascript
复制
collectiveType CollectiveABC {
   classes: A, B, C
   collectiveF2: A.f2, B.f2, C.f2
   collectiveF3: A.f3, B.f3, C.f3
}

像这样使用:

代码语言:javascript
复制
fun collectiveUse(objABC: CollectiveABC) {    // <- Collective type used here allows for defining one behaviour for all three classes
   obj.collectiveF2(12345)
   obj.collectiveF3()
}


fun use() {
   collectiveUse(A())
   collectiveUse(B())
   collectiveUse(C())
}

我知道我可以将相应的函数作为参数传递如下:

代码语言:javascript
复制
fun collectiveUse(f1: (String) -> Unit, f2: (Int) -> Unit, f3: () -> Unit) { ... }


fun use() {
   val a = A()
   val b = B()
   val c = C()

   collectiveUse(a::f1, a::f2, a::f3)
   collectiveUse(b::f1, b::f2, b::f3)
   collectiveUse(c::f1, c::f2, c::f3)
}

但是,正如您所看到的,这些函数使函数头有点长,并且通常不能很好地扩展。是否有可能做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2021-05-25 14:03:48

在Kotlin中,接口可以同时包含抽象方法声明和方法实现。接口不能存储状态这一事实将它们与抽象类区分开来。允许它们具有属性,但它们必须是抽象的,或者给出访问器实现。

我是个初学者,这就是我所知道的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67689589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档