【发布时间】:2019-08-29 22:43:15
【问题描述】:
这个问题是关于在 golang 中“继承”接口实现的最简洁的方法。我理解 Go 没有继承;这个问题是关于人们如何以其他方式实现它,因此引用了继承。
假设定义了一个标准库接口,例如container/heap:https://golang.org/pkg/container/heap/#Interface
假设有一个名为pq.go 的.go 文件实现了该接口:
//pq.go
import ("container/heap")
type PriorityQueue []*Vertex
func (pq PriorityQueue) Len() int { return len(pq) }
func (pq PriorityQueue) Less(i, j int) bool {
...
}
func (pq PriorityQueue) Swap(i, j int) {
...
}
func (pq *PriorityQueue) Push(x interface{}) {
...
}
func (pq *PriorityQueue) Pop() interface{} {
...
}
现在假设我只想要一个 Tiny 变体,称为 MaxPQ,在 maxpq.go 中,用于覆盖 pq.go 的单个实现细节,例如,覆盖 Less(..)。如何在不直接复制最后一个文件、更改类型名称和更改单个函数的实现(例如 less)的情况下实现这一点?
意思是,有没有办法对一个与另一个非常相似的接口进行新的实现?
这样做,从字面上复制它,似乎很激烈,需要在多个地方进行更改:
//maxpq.go
import ("container/heap")
type MaxPriorityQueue []*Vertex
func (pq MaxPriorityQueue) Len() int { return len(pq) }
func (pq MaxPriorityQueue) Less(i, j int) bool {
...
}
func (pq MaxPriorityQueue) Swap(i, j int) {
...
}
func (pq *MaxPriorityQueue) Push(x interface{}) {
...
}
func (pq *MaxPriorityQueue) Pop() interface{} {
...
}
【问题讨论】:
-
Go 中没有继承。
-
@Adrian 我理解 Go 没有继承;这个问题是关于人们如何以其他方式实现它。
-
那你能澄清一下你的问题吗?你反复引用继承,但你说你知道没有这样的事情。
-
@Adrian 已编辑。
-
@Tommy 你考虑过嵌入吗?
标签: go