2017-09-17 7 views
0

有効な構成ですか?それとも他にも解決策がありますか?これはGoのコンポジションの有効な実装ですか?

package main 

import (
    "fmt" 
    "strings" 
) 

type Person struct{ name string } 

type Swimmer struct{} 

func (s *Swimmer) Swim(name string) { 
    fmt.Println(strings.Join([]string{ 
     name, 
     " is swimming", 
    }, "")) 
} 

type IronMan struct { 
    person Person 
    swimmer Swimmer 
} 

func (i *IronMan) Swim() { 
    i.swimmer.Swim(i.person.name) 
} 

func main() { 
    ironMan := IronMan{ 
     person: Person{"Mariottide"}, 
     swimmer: Swimmer{}, 
    } 

    ironMan.Swim() 
} 
+0

何かが構文的に有効であるという理由だけで、それは慣用的であることを意味しません。伝統的なOOPのようにコードをモデル化しようとしないでください。 – Volker

+0

私は慣用的な解決策を探しています。私は伝統的なOOPだけを知っています。 – sensorario

答えて

1

Goがstruct埋め込みがあります

package main 

import (
    "fmt" 
) 

type Person struct{ name string } 

func (p *Person) Talk(message string) { 
    fmt.Printf("%s says: %s\n", p.name, message) 
} 

type Swimmer struct { 
    Person 
} 

func (s *Swimmer) Swim() { 
    fmt.Printf("%s is swimming\n", s.name) 
} 

type IronMan struct { 
    Swimmer 
} 

func main() { 
    ironMan := IronMan{Swimmer{Person{"Mariottide"}}} 

    ironMan.Swim() 
    ironMan.Talk("Hey") 
} 
+0

IronManもランナーとサイクリストです。あなたの解決策では、3人の人を渡す必要がありますか? IronMan {Swimmer {Person {"Mariottide"}、Runner {Person {"Mariottide"}、...} – sensorario

+0

はい。そのためのファクトリを作成することができます。これは、ゴランの構成がどのように機能するかです。この記事をチェックするhttp://hackthology.com/object-oriented-inheritance-in-go.html – zdebra

関連する問題