私は2匹のペット、Lucyという猫とFidoという犬を持っているとします。私は彼らに同じテクニック、「話す」の両方を教えました。私は見越して、私はインターフェイスにコード化されてきたので、より多くのペットを取得し、それらを別のトリックを教えしたいと思います将来的には 自分自身を繰り返すことなく、Goのインターフェースへのコーディング
:package main
import "fmt"
type Pet interface {
speak() string
}
type Dog struct {
speech string
}
type Cat struct {
speech string
}
func (c Cat) speak() string {
return c.speech
}
func (d Dog) speak() string {
return d.speech
}
func getSpeech(p Pet) string {
return p.speak()
}
func main() {
Fido := Dog{"woof"}
Lucy := Cat{"meow"}
fmt.Println("Fido says:", getSpeech(Fido)) // Fido says: woof
fmt.Println("Lucy says:", getSpeech(Lucy)) // Lucy says: meow
}
さて、これはうまく動作しますが、それは不必要と思われます詳細。私は明らかに自分自身を繰り返している。また、すべてのDogsが "woof"と言って、すべてのCatsが "meow"と言っていると仮定すると、構造体内の文字列を初期化するのは慣用的ですか?
インターフェイスの利点を失うことなく、このコードをよりドライなものに再構成するにはどうすればよいでしょうか?
あなたは、構造体の埋め込みを使用して、一般的なフィールド/メソッドを委任することができますが、実際には、あなたはこの不自然な何かを見つけるつもりはありません。 – JimB