golang的对象工厂

时间:2013-11-15 06:23:46

标签: syntax go go-interface

我是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 return * AA还是interface {},编译器都会告诉我错误。我怎样才能使它发挥作用?

1 个答案:

答案 0 :(得分:7)

首先,在go中不允许使用type作为变量名称(请参阅spec)。那是你的第一个问题。

对象工厂的返回类型是* AA。这意味着它只能返回* AA类型的变量,这会导致BB类型的返回失败。如规范中所定义,go没有类型继承,只有struct embedding。

如果你创建一个名为sayer的接口,你可以在ObjectFactory函数中使用它而不是* AA。

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()
}