-2

由于 Go 使用组合系统而不是(多重)继承,我只是想知道这 3 个代码片段。Go 说他们强迫程序员使用组合。

A) 应该是(几乎)正确的 Go-Code,B) 伪 C) 伪

恕我直言,所有三个代码的结果总是相同的,除此之外,B) 和 C) 可以用于更多的东西,而 A) 迫使你坚持组合?

即使您假设 B) 在类中没有排序方法,但是 - 可以说像 A) 这样的全局并没有真正的区别 oO

一)去代码:

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) { ... }
4

1 回答 1

4

不,这不是 go 的工作方式。这是一个可以排序的类型的示例(从标准库中提取)。

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)会更好。

于 2012-06-22T00:25:20.803 回答