2016-03-04 79 views
-1

從下面的例子中,有無論如何Child對象可以調用Parent的方法嗎?例如,我希望Child(boy1和girl1)調用父母的「記住」方法;所以父母可以記住孩子希望他們記住的內容。Golang,打電話給父母的方法

謝謝你這麼多

package main 

import "fmt" 

type child struct { 
    Name string 
} 

func (p *child) Yell() { 
    fmt.Println("Child's yelling") 
} 

type parent struct { 
    Name string 
    Children []child 
    Memory []string 
} 

func (p *parent) Yell() { 
    fmt.Println("Parent's yelling") 
} 

func (p *parent) Remember(line string) { 
    p.Memory = append(p.Memory, line) 
} 

func main() { 
    p := parent{} 
    p.Name = "Jon" 
    boy1 := child{} 
    boy1.Name = "Jon's boy" 
    girl1 := child{} 
    girl1.Name = "Jon's girl" 
    p.Children = append(p.Children, boy1) 
    p.Children = append(p.Children, girl1) 
    fmt.Println(p) 

    p.Yell() 
    for i:=0;i<len(p.Children);i++ { 
     p.Children[i].Yell() 
    } 
} 

感謝@Jim,這裏的解決方案。指針總是令人困惑。

包主要

import "fmt" 

type child struct { 
    Name string 
    prnt *parent 
} 

func (p *child) Yell() { 
    fmt.Println("Child's yelling") 
} 

type parent struct { 
    Name  string 
    Children []child 
    Memory []string 
} 

func (p *parent) Yell() { 
    fmt.Println("Parent's yelling") 
} 

func (p *parent) Remember(line string) { 
    p.Memory = append(p.Memory, line) 
} 

func main() { 
    p := parent{} 
    p.Name = "Jon" 
    boy1 := child{} 
    boy1.Name = "Jon's boy" 
    boy1.prnt = &p 
    girl1 := child{} 
    girl1.Name = "Jon's girl" 
    girl1.prnt = &p 

    p.Children = append(p.Children, boy1) 
    p.Children = append(p.Children, girl1) 
    fmt.Println(p) 

    p.Yell() 
    for i := 0; i < len(p.Children); i++ { 
     p.Children[i].Yell() 
     p.Children[i].prnt.Remember("test:" + p.Children[i].Name) 
    } 

    fmt.Println(p.Memory) 
} 

回答

1

您可以在子結構

type child struct { 
    Name string 
    parent *parent 
} 

func (p *child) Yell() { 
    fmt.Println("Child's yelling") 
    p.parent.Remember(p.Name + " called") 
    p.parent.Yell() 
} 
+0

謝謝。但是,如何用Remember()方法做到這一點?我得到一個零指針錯誤。 – Gon

+0

@Gon:您可以在這裏調用'Remember'與我在這裏調用'Yell'完全相同的方式。如果指針是零,你還沒有分配一個指向父對象的指針。 – JimB

0

一個指針到父我只是一個Golang的首發。

似乎Golang約定是CamelCase類名,並且當繼承基類(「Parent」)時不應該分配變量名。 p.Parent將自動工作,即如下所示:

type Child struct { 
    *Parent // put at top 
    Name string 
} 

func (p *Child) Yell() { 
    fmt.Println("Child's yelling") 
    p.Parent.Remember(p.Name + " called") 
    p.Parent.Yell() 
} 

參考:

  1. http://arch-stable.blogspot.hk/2012/05/golang-call-inherited-constructor.html
  2. https://medium.com/@simplyianm/why-gos-structs-are-superior-to-class-based-inheritance-b661ba897c67

其它一些示例與繼承非指針父像:

type Child struct { 
    Parent // put at top 
    Name string 
} 

不知道哪一個更官方和方便