【问题标题】:Override a specific method of interface覆盖接口的特定方法
【发布时间】:2021-06-11 21:12:21
【问题描述】:

我想实现一个稍微定制的接口版本。我们以sort.Interface 为例。我们已经有了实现整个接口的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. 从父级继承其他方法,例如 LenSwap
  2. 重写Less 方法,不是出于存根/模拟的意图,而是我想要访问底层对象,以便我仍然可以实现我的自定义逻辑.

【问题讨论】:

  • 等一下,请阅读Less func 我在返回比较之前调用abs 函数
  • 请注意,这些不是数组,也不是方法覆盖。

标签: go interface overriding


【解决方案1】:

我在这里无权访问底层数组

其实你是这样的:

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

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

【讨论】:

  • 我同意,我只是想知道如何访问基础数据,您的回答回答了这个问题。关键是我只是把它作为一个示例用例来展示。如果我有一个包含 10 多个方法的更大接口,而我的功能只需要 1 个或为自定义实现更改方法。
猜你喜欢
  • 2013-11-14
  • 2014-10-23
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多