Menu
Coddy logo textTech

Methoden-Promotion

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 36 von 107.

So wie die Einbettung von Structs Felder in das äußere Struct befördert, befördert Go auch Methoden aus eingebetteten Typen. Das bedeutet, dass du Methoden, die für das eingebettete Struct definiert sind, direkt für das äußere Struct aufrufen kannst.

type Engine struct {
    Horsepower int
}

func (e Engine) Start() string {
    return "Engine started"
}

type Car struct {
    Model string
    Engine  // eingebettet
}

Da Car Engine einbettet, wird die Start()-Methode automatisch weitergereicht:

func main() {
    c := Car{
        Model:  "Sedan",
        Engine: Engine{Horsepower: 200},
    }
    
    fmt.Println(c.Start())         // Motor gestartet
    fmt.Println(c.Engine.Start())  // funktioniert auch
}

Diese Einbettung hat eine wichtige Konsequenz für Schnittstellen. Wenn der eingebettete Typ eine Schnittstelle erfüllt, erfüllt der äußere Typ sie automatisch ebenfalls:

type Starter interface {
    Start() string
}

func Ignite(s Starter) {
    fmt.Println(s.Start())
}

func main() {
    c := Car{Model: "Sedan", Engine: Engine{Horsepower: 200}}
    Ignite(c)  // Car erfüllt Starter durch Engine
}

Der Typ Car implementiert Starter nie ausdrücklich, erfüllt jedoch die Schnittstelle, weil sein eingebettetes Engine über die erforderliche Methode verfügt. So erreicht Go die Wiederverwendung von Verhalten ohne traditionelle Vererbung.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Musikplayer-System, das veranschaulicht, wie Methoden eingebetteter Typen an den äußeren Typ weitergereicht werden und wie dadurch die Erfüllung eines Interfaces durch Komposition ermöglicht wird.

Du organisierst deinen Code über zwei Dateien:

  • audio.go: Erstelle die Bausteine für deinen Musikplayer:
    • Eine AudioPlayer-Struktur mit einem Brand-Feld (String) und einer Play() string-Methode, die [Brand] playing audio zurückgibt
    • Ein Playable-Interface, das eine Play() string-Methode erfordert
    • Eine Smartphone-Struktur mit einem Model-Feld, die AudioPlayer einbettet
    • Eine Tablet-Struktur mit einem Model-Feld, die AudioPlayer einbettet
  • main.go: Erstelle eine Funktion namens StartPlayback, die ein beliebiges Playable akzeptiert und das Ergebnis des Aufrufs von Play() zurückgibt. Lies die Geräteinformationen aus der Eingabe ein, erstelle sowohl ein Smartphone als auch ein Tablet und zeige, dass beide über ihren eingebetteten Playable das AudioPlayer-Interface erfüllen, obwohl keiner der beiden Typen Play() selbst explizit implementiert.

Die folgenden Eingaben werden bereitgestellt:

  • Zeile 1: Modellname des Smartphones
  • Zeile 2: Audiomarke des Smartphones
  • Zeile 3: Modellname des Tablets
  • Zeile 4: Audiomarke des Tablets

Gib für jedes Gerät sein Modell aus, gefolgt vom Ergebnis der Übergabe an StartPlayback.

Wenn beispielsweise iPhone 15, Apple Audio, iPad Pro und Beats gegeben sind, sollte deine Ausgabe wie folgt aussehen:

iPhone 15
Apple Audio playing audio
iPad Pro
Beats playing audio

Beachte, dass sowohl Smartphone als auch Tablet an StartPlayback übergeben werden können, weil die Play()-Methode von AudioPlayer automatisch an jeden äußeren Typ weitergereicht wird und dadurch das Playable-Interface ohne zusätzlichen Code erfüllt.

Probier es selbst

package main

import (
	"bufio"
	"fmt"
	"os"
)

// TODO: Erstelle eine StartPlayback-Funktion, die jedes Playable akzeptiert
// und das Ergebnis des Aufrufs von Play() zurückgibt

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Smartphone-Modell einlesen
	scanner.Scan()
	smartphoneModel := scanner.Text()
	
	// Smartphone-Audio-Marke einlesen
	scanner.Scan()
	smartphoneBrand := scanner.Text()
	
	// Tablet-Modell einlesen
	scanner.Scan()
	tabletModel := scanner.Text()
	
	// Tablet-Audio-Marke einlesen
	scanner.Scan()
	tabletBrand := scanner.Text()
	
	// TODO: Erstelle ein Smartphone mit dem eingebetteten AudioPlayer
	
	// TODO: Erstelle ein Tablet mit dem eingebetteten AudioPlayer
	
	// TODO: Gib das Smartphone-Modell aus und rufe dann StartPlayback mit dem Smartphone auf
	
	// TODO: Gib das Tablet-Modell aus und rufe dann StartPlayback mit dem Tablet auf
	
	_ = smartphoneModel
	_ = smartphoneBrand
	_ = tabletModel
	_ = tabletBrand
	fmt.Println("TODO: Complete the implementation")
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Go-Compiler