2011-05-08 1 views
2

구조체의 특정 인터페이스를 구현하는 형식의 새 인스턴스를 반환하는 함수를 보유하려고합니다. 다음은 빼기 예제입니다.이동 (Go)에서 팩토리 기능을 유지하는 방법은 무엇입니까?

package main 

type Adder interface { 
    Add(Adder) 
    Val() int 
} 

type NewAdder func() Adder 

type number int 

type NewHolder struct { 
    newFunc NewAdder 
} 

func (me *number)Add(it Adder) { 
    *me += number(it.Val()) 
} 

func (me *number)Val() int { 
    return int(*me) 
} 

func newAdder() *number { 
    return (*number)(new(int)) 
} 

func main() { 
    var holder NewHolder 
    holder.newFunc = NewAdder(newAdder) 
} 

컴파일하려고하면 cannot convert newAdder (type func() *number) to type NewAdder이 표시됩니다. 그럼 내 목표를 달성하는 데 어떻게 가야 할까? 나는 이러한 기능의 무리를 보유 할 수 있도록하고 싶습니다, 이상적으로

class NewStuffMaker(object): 
    def __init__(self, new): 
     self.new = new 

def make_new(): 
    return [] 
obj = NewStuffMaker(make_new) 
new_lst = obj.new() 

을 (또는 구조체는 기능을 포함 : 여기

은 참조를 위해 내가 할 노력하고있어의 파이썬 예제 및 일부 다른 데이터). 그것은 부당한 일입니까? 다른 사람이 문제가있는 경우 미래의 사람들을 위해

답변

1
package main 

type Adder interface { 
    Add(Adder) 
    Val() int 
} 

type FuncAdder func() Adder 

type Holder struct { 
    FuncAdder 
    SomeOtherData string 
} 

type number int 

func (n *number) Add(a Adder) { 
    *n += number(a.Val()) 
} 

func (n *number) Val() int { 
    return int(*n) 
} 

func NumberAdder() Adder { 
    return Adder(new(number)) 
} 

func main() { 
    var holders []Holder 
    var holder Holder 
    holder.FuncAdder = NumberAdder 
    holder.SomeOtherData = "SomeOtherData" 
    holders = append(holders, holder) 
} 
+3

는, 키 비트는 함수가 인터페이스를 구현하는 인터페이스를 반환하지 유형으로 선언 된 것입니다. – nmichaels