2013-11-15 2 views
2

나는 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 또는 interface {}를 요청해도 오류가 발생합니다. 어떻게 작동시킬 수 있습니까?

+0

무엇 정확한을 오류가 발생합니까? 컴파일러에서 잘못되었다고 알리는 행은 무엇입니까? – user2357112

+1

Go에서 기존 OOP 관용구를 에뮬레이트하려는 것처럼 보일 수도 있습니다 (또는 강제 적용). 이것은 좋은 생각이 아니므로 솔루션을 다시 설계하는 것이 좋습니다 . – Volker

답변

6

먼저 off에서 변수 이름으로 type을 사용하는 것은 go에서는 허용되지 않습니다 (spec 참조). 그것이 첫 번째 문제입니다.

오브젝트 팩토리의 리턴 유형은 * AA입니다. 즉, BB 유형의 리턴을 실패하게하는 * AA 유형의 변수 만 리턴 할 수 있음을의 L합니다. 스펙에 정의 된대로, 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() 
} 
+1

그냥 r을 위해. eference : 명세에서 [예약 키워드 목록] (http://golang.org/ref/spec#Keywords) ... –

+0

링크를 가져 주셔서 감사합니다. 나는 대답을했다. – yumaikas