Gehen "erbschaft" - die Verwendung anonymer Typ in einen struct als parameter der Methode
Ich versuche, die Firma, das Konzept des inheritence, dass Go bietet (eher die "Komposition" als Reine inheritence, vielleicht). Jedoch, ich scheitern zu verstehen, warum ich kann nicht mit den "Eltern" - Typ als func
parameter zu produzieren, eine generische Funktion, wirkt auf die parameter.
package main
import "log"
type Animal struct {
Colour string
Name string
}
type Dog struct {
Animal
}
func PrintColour(a *Animal) {
log.Printf("%s\n", a.Colour)
}
func main () {
a := new (Animal)
a.Colour = "Void"
d := new (Dog)
d.Colour = "Black"
PrintColour(a)
PrintColour(d)
}
Vorausgesetzt mein Verständnis falsch ist, wie kann ich erreichen, was ich will in Gehen?
Bearbeiten
Hinweis:
-
Möchte ich nicht anfügen, das Verhalten der Struktur
-
Ich würde gerne zu halten, der Typ pointer als parameter der Methode, weil ich arbeiten bin getrennt auf eine pet-Projekt und das erfordert-ich manipuliere das struct übergeben, bevor Sie dann auf ihn einwirkenden.
-
In Wirklichkeit, meine
Dog
struct müssten zusätzliche Felder/Mitglieder; hoffentlich nicht schlammig das Wasser weiter
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mag ich hier die Antworten so weit-und ich möchte hinzufügen, dass es erlaubt, statische Typüberprüfung an der Schnittstelle übergeben, die über eine Schnittstelle:
Auf dem Spielplatz
Wird es möglich sein, weitere Felder hinzufügen, um
Dog
. Der Unterschied zu Uriel, die Antwort ist, dass Anrufe zuPrintColour
scheitern wird zur compile-Zeit, wenn auch etwas anderes als ein struct implementierenAnimalizer
übergeben wird.Auch Sie nicht haben, um ein typeswitch, da der compiler kennt eine
Animalizer
ist die UmsetzungGetColour
.Und schließlich das Verhalten (Druck) wird getrennt von der struct
GetColour
nur die Renditen der Farbe.Wenn Sie erklären, die
PrintColour
Methode auf dieAnimal
geben, es wird "vererbt", wenn SieAnimal
imDog
.Dies ist bekannt als "Einbettung" in die Welt Gehen. Sehen Die "Einbettung" in Abschnitt Effektiver Gehen für mehr info.
Probieren Sie etwas wie:
Produziert:
Spielplatz
Könnten Sie versuchen, es mit
interface{}
Embedded (anonym) - Feld kann immer noch explizit auf die über seine typename :
Spielplatz
In der Referenz : der Satz nach der zweiten code-block wird erklärt, wie Sie erklären, ein "anonymer" - Feld, und Staaten :
Colour
), aber auch für einen speziellen Typ.Mein Beispiel ist vielleicht nicht groß, aber Sie können tun, was Sie wollen auf diese Weise:
http://play.golang.org/p/JoAlOvJthr
Verwenden Sie im wesentlichen eine Schnittstelle definieren, die gemeinsame Funktionalität, die Sie verfügbar machen möchten, um die Außenwelt in all Ihren Arten und eingebetteten Schriften.
(Mein Beispiel ist vielleicht nicht das beste, aber es funktioniert)