2012-06-21 25 views
-2

由於谷歌Go使用合成系統,而不是(多)繼承,我只是想知道這3個代碼片段。谷歌去說,他們強迫程序員使用組合。谷歌去,組成和多繼承

A)應該是(幾乎)正確圍棋碼, 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) { ... } 
+2

你的問題是什麼? – Ashe

+0

在你的代碼中,你在接口上實現了一個方法。 Go實際上並不允許你這樣做。您可能打算創建一個將排序接口作爲參數的函數。 –

回答

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接口A型沒有得到一個新的方法。您不能將方法分配給接口,例如您的示例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會更好。

+0

首先:感謝您的回覆,它幫助了我很多。 那麼缺少的代碼示例在這裏實際上是排序函數,該函數實現排序界面 FUNC排序(有幾分)結構{// 做分揀 } – SilverBln

+0

@SilverBln,我添加了一個例子功能採用排序界面的類型。我選擇不發佈實際的排序功能,因爲它太長了。 –