2017-09-17 2 views
0

Cette composition est-elle valide? Ou existe-t-il d'autres solutions?Est-ce une implémentation valide de la composition dans 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

Tout simplement parce que quelque chose est syntaxiquement valide ne signifie pas qu'il est idiomatiques. S'il vous plaît ne pas essayer de modéliser votre code comme vous le feriez dans la POO traditionnelle. – Volker

+0

Je cherche des solutions idiomatiques. Je ne connais que la POO traditionnelle. – sensorario

Répondre

1

Go a struct plongement:

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 est aussi coureur et cycliste. Avec votre solution, vous devez passer trois fois la personne? IronMan {Swimmer {Person {"Mariottide"}, Coureur {Person {"Mariottide"}, ...} – sensorario

+0

Oui. Vous pouvez créer une usine pour cela. C'est ainsi que fonctionne la composition de golang. Consultez cet article http://hackthology.com/object-oriented-inheritance-in-go.html – zdebra