Kotlin – 限制扩展方法范围

有没有办法限制DSL中的扩展方法?

说我有这样的班级结构:

class Outer { fun middle(op: Middle.() -> Unit): Middle { val middle = Middle() middle.op() return middle } } class Middle { fun inner(op: Inner.() -> Unit): Inner { val inner = Inner() inner.op() return inner } } class Inner fun outer(op: Outer.() -> Unit): Outer { val outer = Outer() outer.op() return outer } 

然后我可以创建一个如下所示的调用:

 outer { middle { inner { middle { } // Here is the problem } } } 

我的问题是标记的middle { }调用是令人困惑的,因为当它看起来像添加到Inner时,它将Middle添加到Outer

有没有办法不允许middle { }调用?

您可以使用deprecated使用的解决方法:

 class Outer { fun middle(op: Middle.() -> Unit): Middle {...} @Deprecated("can not be used inside a Outer block", level = DeprecationLevel.ERROR) fun outer(op: Outer.() -> Unit): Outer = TODO() } class Middle { fun inner(op: Inner.() -> Unit): Inner {...} @Deprecated("can not be used inside a Middle block", level = DeprecationLevel.ERROR) fun middle(op: Middle.() -> Unit): Middle = TODO() } class Inner { @Deprecated("can not be used inside a Inner block", level = DeprecationLevel.ERROR) fun inner(op: Inner.() -> Unit): Inner = TODO() } 

现在编译器会给你一个错误,而IDE在完成时不会提示错误的函数:

 outer { middle { inner { middle { } // error } } } 

但是你真的不应该为大的DSL做。 @KirillRakhman建议您最好等https://youtrack.jetbrains.com/issue/KT-11551

编辑:我解决了我的例子后,它变得更小。 一个类的虚拟函数毕竟不是那么多的样板。