2015-08-13 30 views
6

karşılamak için birden yapılar genelinde bir işlevi bir arabirim karşılamak için birden yapılar arasında aynı işlevini kullanabilirsiniz yine de var mı? ÖrneğinYeniden bir arayüz

: Kurt ve Beagle aynı işlevi paylaşan Çünkü

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()) 
} 

, o zaman, bir kere o fonksiyonu yazma ikisi de Hayvan tatmin böylece iki yapılar arasında paylaşmak için zaten var mı?

cevap

15

Sen "feryat" diye hayvanların her biri tarafından gömülü olduğu bir ebeveyn yapı oluşturabilir. ana yapı Wolf ve BeagleAnimal arabirim uygulamak anlamına Speak() string yöntemi uygular.

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

gömme olan yapı üzerinde herhangi alanları başvurmak için gömülü tipine yöntemi için yine de var mı? – sjmh

+0

Yansıma kullanılabilir, i gues. çalışma zamanı hatası bu şekilde artması olasılığı maalesef ... – Altenrion

+0

sjmh onun alıcısı gömülü olduğu bir yapı içinde alanları başvuruda bulunabilir bir yöntem yazmak mümkün değildir çünkü çok, herhangi controll ve herkes çağrıyı kontrol etmek orada içe olacağını Böyle bir sözdizimi yoktur ve böyle bir yapıda * * gömülmediğinde ne yapması gerektiği net bir yol yoktur. – thomasrutter