在 Kotlin 中,我想为具有一组相关函数的类添加一个“命名空间”。我的类的客户端将使用该命名空间来帮助分类他们想要执行的操作类型....
在 Kotlin 中,我想为具有一组相关函数的类添加一个“命名空间”。我的类的客户端将使用该命名空间来帮助分类他们想要执行的操作类型。(我知道您认为这些函数应该放在不同的类中,问题解决了。但出于其他原因,将所有函数放在一个类中更方便)。
因此,我可能有一个 Uber
包含 fooInsert
fooOpen
fooDispose
和 的 barInsert
barTerminate
类 barHop
。如您所见,它们没有通用接口。只是一堆由于某种原因属于同一类的函数。有些函数与其他函数有亲和力(即这些 fooXXX
函数“属于”一起,就像“barYYY”函数一样)。
我想到的是:
class Uber {
inner class FooNamespace {
fun insert(): Unit {}
fun open(): Unit {}
fun dispose(): Unit {}
}
val foo = FooNamespace()
inner class BarNamespace {
fun insert(): Unit {}
fun terminate(): Unit {}
fun hop(): Unit {}
}
val bar = BarNamespace()
}
该类的用户可以做这样的事情:
val uber = Uber()
uber.foo.insert()
uber.bar.hop()
我想要的是将 inner class ...
and val xxx = XxxNamespace()
成一个表达式。例如:
// This doesn't actually compile
val foo = object: inner class {
fun insert(): Unit {}
fun open(): Unit {}
fun dispose(): Unit {}
}
我认为这是不可能的,至少目前是这样。
这里的主要技术问题是, uber.foo.insert()
实际上被解释为链接 uber.foo
,然后 .insert()
。因此,要使它起作用, uber.foo
需要有一个明确定义的类型。它不能是匿名类/对象,因为这样就无法描述是什么类型 uber.foo
.
话虽如此,我一直想知道为什么 Kotlin 不支持这种语法:
val foo = object Foo {}
这与对象声明一致,其中单例的名称同时也是类的名称。而且编译器甚至理解上述语法,因为它会抛出错误:“对象表达式无法绑定名称”。所以 Kotlin 的作者似乎有意禁止这种用法。
我在 YouTrack 中发现了一个问题,所以我们至少可以对它投赞成票: https://youtrack.jetbrains.com/issue/KT-21329