由于Go使用合成系统而不是(多重)继承,我只是想知道这3个代码片段。 Go说它们迫使程序员使用组合。
A)应该(几乎)正确的Go-Code, B)伪 C)伪
Imho结果在所有三个代码上总是相同的,除了事实,B)和C)可以用于更多的东西和A)强迫你坚持组合?
即使你假设B)在类中没有sort-method但是 - 让我们说像A这样的全局不会产生真正的差别oO
A)转码:
interface Sort
Len()
Less(i, j int) bool
Swap(i, j int)
func (qs *Sort) sort()
doTheSorting
type MyData struct {
var value int
}
func (s *MyData) Len() { ... }
func (s *MyData) Less(i, j int) bool { ... }
func (s *MyData) Swap(i, j int) { ... }
B)看起来像继承,但根据编译器的工作原理,它可以被视为嵌入式。
class Sort
public sort() { ... }
abstract Len()
abstract Less(i, j int) bool
abstract Swap(i, j int)
C)
interface SortInterface
void Len()
bool Less(i, j int)
void Swap(i, j int)
class Sort implements SortInterface
public sort() { ... }
用法B和C:
class MyClass **embed** Sort
int value
void Len() { ... }
bool Less(i, j int) { ... }
void Swap(i, j int) { ... }
答案 0 :(得分:4)
不,这不是怎么回事。以下是可以排序的类型的示例(从标准库中提取)。
type IntSlice []int
func (p IntSlice) Len() int { return len(p) }
func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
这实现了接口:
// Name of interface changed for clarity
type Sort interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
实现Sort
接口的类型不会获得新方法。您无法将方法分配给界面,例如示例func (qs *Sort) sort() {...}
。
但是,允许将其传递给期望类型为Sort
的变量的函数和方法。因此,我可以调用sort.Sort(myIntSlice)
然后对其进行排序。
这是一个示例函数,它接受任何实现Sort
接口的参数:
func IsSorted(data Sort) bool {
n := data.Len()
for i := n - 1; i > 0; i-- {
if data.Less(i, i-1) {
return false
}
}
return true
}
在IsSorted
中,函数不知道真正的数据类型是什么。它可能是IntSlice
或其他任何内容。它所知道的是,你给它的任何参数都实现了Sort接口中的方法。
我似乎无法弄清楚你问的问题。另外,伪代码很难理解。使用另一种语言如java会更好。