在 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 {}
}
这里的问题是,如果您想公开访问这些成员,则需要一个正确定义的类型。
对于私有属性,语法 val foo = object { ... }
是足够的,但对于公开暴露的属性,这些会被推断为 Any
并且使它们无法使用。
一个选择显然是为这些类型定义一个接口,但它比你已经想出的还要样板化,所以我很确定这不适合你的需要:
interface FooNamespace {
fun insert()
fun open()
fun dispose()
}
class Uber {
val foo = object : FooNamespace {
override fun insert(): Unit {}
override fun open(): Unit {}
override fun dispose(): Unit {}
}
}
我知道你认为这些函数应该放在不同的类中,问题解决了。但出于其他原因,将所有函数放在一个类中更方便
我确实是这样想的,并且很想听到更多关于为什么把所有东西都放在同一个类中会如此方便的信息:)因为这些类是 inner classes
,所以我假设这与从访问私有状态有关 Uber
,但这也可以通过将这个私有状态包装到传递给 foo 和 bar 的另一个类中来完成。