覆盖接口的特定方法

Override a specific method of interface

我想实现一个稍微自定义的接口版本。让我们以实现整个接口的 sort.Interface as an example. We already have sort.IntSlice 为例。但是我想实现一个 AbsoluteSort 算法。为此,我只想更改 Less 方法。像这样:

type AbsSortedArray struct {
    sort.IntSlice
}

func (a AbsSortArray) Less(i, j int) bool {
    return abs(a[i]) < abs(a[j])      // this causes an error as I don't have access to underlying array here
}

func abs(i int) int {
    if i  < 0 {
        return i * -1
    }
    
    return i
}

所以基本上我想要实现的是:

  1. 从父
  2. 继承其他方法,如LenSwap
  3. 覆盖Less方法,但是不是为了stubbing/mocking,而是我想要访问底层对象,以便我仍然可以实现我的自定义逻辑。

I don't have access to underlying array here

实际上,你这样做:

func (a AbsSortArray) Less(i, j int) bool {
    return abs(a.IntSlice[i]) < abs(a.IntSlice[j])
}

但是这个 AbsSortedArray 是一种使用起来很麻烦的数据类型(因为现在您必须处理带有 slice 成员的结构,而不是直接使用 slice)。在此特定示例中,仅提供您自己的从头开始实施可能会更具可读性和可维护性。