2016-03-04 142 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 
} 

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