如果您尝试在界面上创建内联函数,则会遇到错误:'inline' modifier is not allowed on virtual members. Only private or final members can be inlined
我知道这是因为该功能是虚拟的,因为它可以被覆盖。
如果我们能够声明“关闭”函数,这些函数将不是虚函数,因此能够内联这是非常有用的!
使用“私人”给我们一个非虚拟的“封闭”功能,但是世界其他地方都无法使用它!
那么..有没有办法为抽象类型定义“封闭的”非虚拟内联函数?
( p.s。我打算自己回答这个问题,但随时可以分享你自己的答案!)
答案 0 :(得分:4)
你说的是“抽象类型”,对于抽象类,你可以声明一个inline
函数,它自动被认为是最终的。
abstract class BaseThing {
inline fun foo() = "asdf"
}
可以调用函数foo
,但不能在后代类中重写。这会导致错误:
'BaseThing'中的'Foo'是最终的,无法覆盖
另一方面,界面不能有最终方法。但是你可以为界面编写一个扩展函数,它的行为几乎相同。
interface TraitThing { }
inline fun TraitThing.foo() = "asdf"
但是没有保护或“封闭性”,因为你可以在实现类中实现相同名称的方法,并且它将优先。