在Go语言中的对象工厂(Object Factory)

huangapple go评论147阅读模式
英文:

Object Factory in 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(t int) *AA {
    if t == 1 {
        return new(AA)
    } else {
        return new(BB)
    }
}

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

编译器告诉我无论我让ObjectFactory返回*AA还是interface{}都会出错。我该如何使其正常工作?

英文:

I am a new to golang. I need to design a function to create object of differing types based on input. But I failed to figure out how to design the interface. Here comes my code:

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

The compiler tells me error no matter I ask ObjectFactory return *AA or interface{}. How can I make it work?

答案1

得分: 7

首先,使用type作为变量名在Go语言中是不允许的(参见规范)。这是你的第一个问题。

对象工厂的返回类型是AA。这意味着它只能返回AA类型的变量,这导致了返回类型为BB的失败。根据规范的定义,Go语言没有类型继承,只有结构体嵌入。

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

type sayer interface {
    say()
}

在尝试实现多重分派时,你可能希望使用这个接口(如下面的代码所示,也可以参见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()
}

希望对你有帮助!

英文:

First off, using type as a variable name is disallowed in go (see the spec). That is your first problem.

The return type of object factory is *AA. This means that it can only return variables of type *AA, which causes the return of type of BB to fail. As defined in the spec, go doesn't have type inheritance, just struct embedding.

If you create an interface called sayer, you can use that instead of *AA in your ObjectFactory function.

type sayer interface {
    say()
}

You probably want to use this interface when trying to get multiple dispatch (as demonstrated in the code below (see on play.golang.org as well).

Try this code:

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

huangapple
  • 本文由 发表于 2013年11月15日 14:23:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/19994775.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定