包装在类中的扩展功能

时间:2018-06-20 10:00:43

标签: function kotlin overloading extension-methods operator-keyword

以下示例显示了购物清单项目的类,可以将其乘以更改金额。为了能够从任一方向相乘,我需要一个ShoppingListItem类和Int类的运算符函数。 我不喜欢类Int的扩展功能不是ShoppingListItem类的一部分,因为它在逻辑上与之连接。有任何想法如何将其包装在里面吗?

data class ShoppingListItem(val name: String, val amount: Int = 1) {
    operator fun times(num: Int) = ShoppingListItem(this.name, this.amount * num)
}

operator fun Int.times(item: ShoppingListItem) = ShoppingListItem(item.name, item.amount * this)


fun main(args: Array<String>) {
    val myItem = ShoppingListItem("Apple")
    println(myItem)     // ShoppingListItem(name=Apple, amount=1)
    println(myItem * 2) // ShoppingListItem(name=Apple, amount=2)
    println(3 * myItem) // ShoppingListItem(name=Apple, amount=3)
}

1 个答案:

答案 0 :(得分:1)

您不能将其放置在班级内-这将使其成为只能在班级内调用的member extension

您在这里可以做的最好的事情就是将数据类及其所属的扩展名放在同一文件中。