向多个非继承类添加方法

时间:2018-03-20 17:41:26

标签: kotlin extension-function

有没有办法向多个类添加方法,或者减少实现相同代码所需的重复代码量。

目前我使用以下内容(在此示例中添加一个c方法,用于计算iterable中项目的重复次数):

/** Counts each of the distinct items. */
fun <T> Iterable<T>.c() = groupingBy { it }.eachCount()
/** Counts each of the distinct items. */
fun <T> Sequence<T>.c() = groupingBy { it }.eachCount()
/** Counts each of the distinct items. */
fun <T> Array<T>.c() = groupingBy { it }.eachCount()

我想知道是否有办法减少代码量,目前我重复一遍,我想在3种类型中的任何一种上使用所有方法。

我能找到的唯一方法是使用常用方法定义一个接口,然后使用一个类用实现公共接口来包装每个类型,但这看起来像很多可能的代码一种更简单的方式。

1 个答案:

答案 0 :(得分:2)

您目前所拥有的是您能做的最好的事情。如果您查看一些标准库集合函数的实现,您将看到它们分别为IterableSequenceArray实现,然后逐个实现原始数组包装器。

例如,您调用的groupingBy个函数有3个不同的函数,可以找到它们hereherehere。因此,即使您可以以某种方式同时扩展所有这些类,也无法对它们调用相同的groupingBy方法,您需要单独处理它们。

总而言之,不幸的是答案是否定的,它并没有比你在一天结束时在你的应用程序中必须拥有的代码更好。如果您有许多这样的情况,请考虑查看所有不同情况的代码生成(这也是标准库代码的维护方式)。