est-il possible d'appeler une méthode de remplacement du parent struct dans Golang?

Je veux mettre en œuvre un tel code, si B hérite de A et de remplacer que des Foo() la méthode, et j'espère que le code pour imprimer B. Foo(), mais elle continue d'impression A. Foo(), il semble que le récepteur dans Golang ne peut pas travailler comme ça en C++, dans lequel lors de la liaison dynamique est activé, le code peut fonctionner comme ce que je veux.

J'ai aussi poster un autre morceau de code, qui fonctionne, mais c'est trop dur à mettre en œuvre, et de plus en plus comme un hack, je pense que ce n'est pas un Golang style.

Donc mon problème est: si le parent du Bar() la méthode a une certaine logique, par exemple, ouvrir un fichier, puis de lire quelques lignes, et l'utilisation de Foo() pour la sortie de ces lignes à stdout, et de l'Enfant (dans l'exemple B) veut utiliser la plupart d'entre eux, la seule différence est que l'Enfant veut Foo() à la sortie de la lignes à un autre fichier. Comment dois-je mettre en œuvre? J'ai entendu dire que Golang l'héritage ne peut pas travailler comme C++ ou Java, et ce qui est droit chemin dans Golang?

package main 

import ( 
        "fmt" 
) 

type A struct { 
} 

func (a *A) Foo() { 
        fmt.Println("A.Foo()") 
} 

func (a *A) Bar() { 
        a.Foo() 
} 

type B struct { 
        A 
} 

func (b *B) Foo() { 
        fmt.Println("B.Foo()") 
} 

func main() { 
        b := B{A: A{}} 
        b.Bar() 
}

output: A.Foo()

le morceau suivant fonctionne, mais quand écrire

a := A{}
a.Bar()

vous rencontrerez une erreur de compilateur

package main

import (
    "fmt"
)

type I interface {
    Foo()
}

type A struct {
    i I

}

func (a *A) Foo() {
    fmt.Println("A.Foo()")
}

func (a *A) Bar() {
    a.i.Foo()

}

type B struct {
    A
}

func (b *B) Foo() {
    fmt.Println("B.Foo()")
}

func main() {
    b := B{A: A{}}
    b.i = &b     //here i works like an attribute of b
    b.Bar()

output: B.Foo()
InformationsquelleAutor zhaozhi | 2014-01-21