2015-08-13 2 views
6

Gibt es trotzdem, dass Sie die gleiche Funktion über mehrere Strukturen hinweg verwenden können, um eine Schnittstelle zu erfüllen?Wiederverwendung einer Funktion über mehrere Strukturen, um eine Schnittstelle zu erfüllen

Zum Beispiel:

package main 

import "fmt" 

type Animal interface { 
    Speak() string 
} 

type Dog struct {} 

func (d Dog) Speak() string { 
    return "Woof!" 
} 

type Wolf struct {} 

func (w Wolf) Speak() string { 
    return "HOWWWWWWWWL" 
} 

type Beagle struct {} 

func (b Beagle) Speak() string { 
    return "HOWWWWWWWWL" 
} 

type Cat struct {} 

func (c Cat) Speak() string { 
    return "Meow" 
} 

func main() { 
    var a Animal 
    a = Wolf{} 
    fmt.Println(a.Speak()) 
} 

Weil Wolf und Beagle genau die gleiche Funktion teilen, ist es trotzdem diese Funktion einmal zu schreiben, ist es dann zwischen den beiden Strukturen teilen, so dass sie beiden Tiere befriedigen?

Antwort

15

Sie können eine Elternstruktur erstellen, die von jedem der Tiere, die "heulen", eingebettet wird. Die Elternstruktur implementiert die Speak() string-Methode, dh Wolf und Beagle implementieren die Animal Schnittstelle.

package main 

import "fmt" 

type Animal interface { 
    Speak() string 
} 

type Howlers struct { 
} 

func (h Howlers) Speak() string { 
    return "HOWWWWWWWWL" 
} 

type Dog struct {} 

func (d Dog) Speak() string { 
    return "Woof!" 
} 

type Wolf struct { 
    Howlers 
} 

type Beagle struct { 
    Howlers 
} 

type Cat struct {} 

func (c Cat) Speak() string { 
    return "Meow" 
} 

func main() { 
    var a Animal 
    a = Wolf{} 
    fmt.Println(a.Speak()) 
} 

https://play.golang.org/p/IMFnWdeweD

+2

Gibt es trotzdem für das Verfahren auf dem eingebetteten Typ alle Felder auf der Struktur zu verweisen, die es bettet? – sjmh

+0

Reflexion kann verwendet werden, ich glaube. Aber es wäre sehr wichtig, jeden zu kontrollieren und jeden Anruf zu überprüfen, weil auf diese Weise die Möglichkeit der Laufzeitfehler leider erhöhen ... – Altenrion

+0

sjmh ist es nicht möglich, eine Methode zu schreiben, die Felder in einer Struktur referenzieren kann, in der sein Empfänger eingebettet ist, als solche existiert eine Syntax nicht und es gibt keine klare Art, wie sie sich verhalten sollte, wenn sie nicht in eine solche Struktur eingebettet ist. – thomasrutter

Verwandte Themen