对不起,标题很糟糕,但是我似乎找不到允许的方法问这个问题,因为我不知道如何引用我正在查看的代码结构。
我不明白这是怎么回事:
override fun update(entity: GameEntity<out EntityType>, context: GameContext): Boolean {
val (_, _, uiEvent, player) = context
我能理解一些事情。
我们将覆盖行为类(该类的超类)中定义的更新函数。
更新功能接受两个参数。一个名为GameEntity的实体,一个名为GameContext的上下文。
该函数返回布尔结果。
但是,我根本不理解下一行。只需打开和关闭括号,两个下划线作为前两个参数,然后分配给context参数即可。我们将上下文的值分配给什么?
基于IDE行为,显然开/关括号与GameContext的构造函数有关。但是我不知道那样。我也不明白参数列表中下划线的含义。
最后,我已经阅读了有关声明站点差异关键字“ out”的信息,但实际上我并不明白这意味着什么。我们有GameEntity
答案 0 :(得分:2)
val (_, _, uiEvent, player) = context
您正在从上下文中提取第3个和第4个值,而忽略了前两个。
比较https://kotlinlang.org/docs/reference/multi-declarations.html。
关于out
:我看不到您显示的代码段中正在使用它。您可能想要显示完整的方法。
另外,也许它仅仅是为了覆盖方法,以匹配函数的签名。
答案 1 :(得分:0)
要掩盖Incubbus本来无法回答的一点点问题:
在声明中
override fun update(entity: GameEntity<out EntityType>, // …
out
意味着您可以调用该函数并传递一个GameEntity<SubclassOfEntityType>
(甚至是一个SubclassOfGameEntity<SubclassOfEntityType>
)。
没有out
的情况下,您必须通过GameEntity<EntityType>
(或SubclassOfGameEntity<EntityType>
)。
我猜这是从您要重写的超类方法继承的。毕竟,如果可以使用GameEntity<SubclassOfEntityType>
来调用超类方法,那么您的覆盖也将需要处理它。 (Liskov substitution principle发挥了作用!)