2013-11-15 61 views
2

我是golang的新手。我需要設計一個函數來根據輸入創建不同類型的對象。但我沒有弄清楚如何設計界面。這裏來我的代碼:golang的對象工廠

package main 

import (
    "fmt" 
) 

type AA struct{ 
    name string 
} 

func (this *AA) say(){ 
    fmt.Println("==========>AA") 
} 
type BB struct{ 
    *AA 
    age int 
} 
func (this *BB) say(){ 
    fmt.Println("==========>BB") 
} 

func ObjectFactory(type int) *AA { 
    if type ==1 { 
     return new(AA) 
    }else{ 
     return new(BB) 
    } 
} 

func main() { 
    obj1 := ObjectFactory(0) 
    obj1.say() 
    obj2 := ObjectFactory(0) 
    obj2.say() 
} 

無論我問ObjectFactory返回* AA或接口{},編譯器告訴我錯誤。我怎樣才能使它工作?

+0

什麼確切錯誤你會得到什麼?編譯器告訴你什麼是錯誤的? – user2357112

+1

看起來好像你試圖在Go中模擬傳統的OOP習慣用法(或強制),這不是一個好主意,你可能會考慮重新設計你的解決方案 – Volker

回答

6

首先,使用type作爲變量名不允許進入(請參閱spec)。這是你的第一個問題。

對象工廠的返回類型是* AA。這意味着它只能返回類型爲* AA的變量,這會導致BB類型的返回失敗。如規範中所定義的,go沒有類型繼承,只是結構嵌入。

如果你創建了一個名爲薩耶爾的界面,你可以用這個來代替* AA在你的ObjectFactory功能。

type sayer interface { 
    say() 
} 

你可能想試圖讓多個調度(如下面的代碼演示時使用此接口(見on play.golang.org以及)

試試這個代碼:

package main 

import (
    "fmt" 
) 

type sayer interface { 
    say() 
} 

type AA struct{ 
    name string 
} 

func (this *AA) say(){ 
    fmt.Println("==========>AA") 
} 
type BB struct{ 
    *AA 
    age int 
} 
func (this *BB) say(){ 
    fmt.Println("==========>BB") 
} 

func ObjectFactory(typeNum int) sayer { 
    if typeNum ==1 { 
     return new(AA) 
    }else{ 
     return new(BB) 
    } 
} 

func main() { 
    obj1 := ObjectFactory(1) 
    obj1.say() 
    obj2 := ObjectFactory(0) 
    obj2.say() 
} 
+1

只爲r參考:來自規範的[保留關鍵字列表](http://golang.org/ref/spec#Keywords)... –

+0

感謝您的鏈接。我提出了答案。 – yumaikas