1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Factorys für "komponierte" Structs in Go

Dieses Thema im Forum "Sonstige Programmiersprachen" wurde erstellt von dominikb, 25. März 2018.

  1. dominikb

    dominikb Member

    Hi,

    ich habe ein Design-Problem in Go: Ich hätte gerne ein Struct (vergleichbar mit einer Unterklasse), welches die Attribute eines Structs, das es anynom einbindet (Komposition; vergleichbar mit Oberklasse), immer mit bestimmten Werten füllt.

    Java-Beispiel:

    Code:
    public class Fahrzeug {
    
        private String kennzeichen;
        private int maxGeschwindigkeit;
    
        public Fahrzeug(String kennzeichen, int maxGeschwindigkeit) {
            this.kennzeichen = kennzeichen;
            this.maxGeschwindigkeit = maxGeschwindigkeit;
        }
    }
    
    
    Code:
    public class Pkw extends Fahrzeug {
    
        public Pkw(String kennzeichen) {
            super(kennzeichen, 180); //Fester Wert wird gesetzt
        }
    }
    
    
    Zum Erstellen eines Pkw-Objekts gibt man einfach das Kennzeichen an, maxGeschwindigkeit hat dann immer den selben Wert.

    Prinzipiell wäre das ein Fall für ein statisches Attribut, aber in Go geht das ja nicht. Das heißt, ich müsste diesen festen Wert in der Factory-Funktion (wie hier im Konstruktor) setzen. Das ist meiner Meinung nach aus designtechnischer Sicht auch in Ordnung so.

    Nur wie setze ich diese Anforderung in Go am besten um? Mein Ansatz hätte so ausgesehen:

    Code:
    type Fahrzeug struct {
        kennzeichen string
        maxGeschwindigkeit int
    }
    
    func CreateFahrzeug(kennzeichen string, maxGeschwindigkeit int) *Fahrzeug {
        return &Fahrzeug{kennzeichen, maxGeschwindigkeit}
    }
    
    type Pkw struct {
        Fahrzeug
    }
    
    func CreatePkw(kennzeichen string) *Pkw {
        //Wie kann ich hier Werte für meinen Fahrzeug-Member setzen?
    }
    CreateFahrzeug() in der Funktion CreatePkw() aufzurufen wäre natürlich Blödsinn und würde vom Typ her nicht passen, aber was müsste ich an dieser Stelle machen, um an das gleiche Ergebnis wie beim Java-Beispiel zu kommen?

    Ich komme noch nicht ganz dahinter. :)

    Danke im Voraus!
  2. dominikb

    dominikb Member

    Gestern ist mir die Lösung noch gekommen. Da bin ich wohl am Leben vorbeigelaufen und habe den Wald vor lauter Bäumen nicht gesehen:

    Code:
    func CreatePkw(kennzeichen string) *Pkw {
        return &Pkw{
            Fahrzeug{kennzeichen, 180},
        }
    }
    Das reicht aus, um den gewünschten Effekt zu erzeugen, denn ich kann ja den Fahrzeug-Member explizit initialisieren, auch wenn er anonym ist.