2013-11-15 3 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 (или нажимаете на). Это не очень хорошая идея. Возможно, вы решили пересмотреть свое решение – Volker

ответ

6

Прежде всего, используя type в качестве имени переменной запрещается входить (см. spec). Это ваша первая проблема.

Обратный тип объекта завод - * AA. Это означает, что он может возвращать только переменные типа * AA, что приводит к сбою возврата типа BB. Как определено в спецификации, go не имеет наследования типов, а просто встраивает структуру.

Если вы создаете интерфейс под названием sayer, вы можете использовать его вместо * 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 eference: [список зарезервированных ключевых слов] (http://golang.org/ref/spec#Keywords) из спецификации ... –

+0

Спасибо за ссылку. Я положил ответ. – yumaikas

Смежные вопросы