【问题标题】:Composition and multiple inheritance组合和多重继承
【发布时间】:2012-06-24 06:52:13
【问题描述】:

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

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

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

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

A) Go 代码:

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

【问题讨论】:

  • 在你的 go 代码中,你在接口上实现了一个方法。 Go 实际上并不允许你这样做。您可能打算创建一个将排序接口作为参数的函数。

标签: inheritance interface go composition


【解决方案1】:

不,这不是 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)会更好。

【讨论】:

  • 首先:感谢您的回复,对我帮助很大。所以这里的代码示例中缺少的实际上是排序函数,它采用实现排序接口的结构 func sort(s Sort) { //do the sort }
  • @SilverBln,我添加了一个示例函数,该函数采用 Sort 接口的类型。我选择不发布实际的排序功能,因为它太长了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2015-02-18
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多