navigation Navigation


Inhaltsverzeichnis

Interface Embedding


Interface Embedding in Go ist ein leistungsstarkes Konzept, das es ermöglicht, Interfaces zu kombinieren und wiederverwendbaren Code zu erstellen. Dieser Artikel erklärt die Grundlagen, zeigt die Syntax und bietet praktische Beispiele, um die Funktionsweise und Vorteile dieses Ansatzes zu verdeutlichen.

Inhaltsverzeichnis

    Einführung

    Interface Embedding ist ein mächtiges Feature in Go, das es ermöglicht, ein Interface in ein anderes Interface einzubetten. Dadurch erbt das äußere Interface automatisch alle Methoden des eingebetteten Interfaces. Dies ist Go’s Weg, Interface-Vererbung ohne explizite Vererbungsschlüsselwörter zu implementieren.

    Wichtige Konzepte

    • Ein Interface kann andere Interfaces einbetten
    • Das einbettende Interface erbt automatisch alle Methoden der eingebetteten Interfaces.
    • Die Einbettung geschieht zur Compile-Zeit und kein Laufzeit-Overhead
    • Durch Embedding sind hiearchische Interface-Strukturen möglich

    Syntax

    Die Syntax für Interface Embedding ist einfach: Man schreibt einfach den Namen des einzubettenden Interfaces in das neue Interface.

    Syntax
    // Basis-Interface
    type Reader interface {
        Read([]byte) (int, error)
    }
    
    // Interface das Reader einbettet
    type ReadCloser interface {
        Reader
        Close() error
    }

    Beispiel

    Hier ist ein grundlegendes Beispiel zur Veranschaulichung der Embedded Interfaces.

    Beispiel
    package main
    
    import "fmt"
    
    type Device interface {
        TurnOn()
        TurnOff()
        IsOn() bool
        GetName() string
    }
    
    type ElectricDevice interface {
        Device
        IsCharging() bool
        Charge()
        GetBatteryLevel() int
    }
    
    type Radio interface {
        Play(station string)
    }
    
    type Smartwatch struct {
        name string
        isOn bool
        batteryLevel int
        isCharging bool
    }
    
    // Factory function
    func NewSmartwatch(name string) *Smartwatch {
        return &Smartwatch{
            name: name,
            isOn: false,
            batteryLevel: 50,
            isCharging: false,
        }
    }
    
    func (s *Smartwatch) TurnOn() {
        if !s.isOn {
            s.isOn = true
            fmt.Printf("%s wird eingeschaltet\n", s.name)
        }
    }
    
    func (s *Smartwatch) TurnOff {
        if s.isOn {
            s.isOn = false
            fmt.Printf("%s wird ausgeschaltet\n", s.name)
        }
    }
    
    func (s *Smartwatch) IsOn() bool {
        return s.isOn
    }
    
    func (s *Smartwatch) GetName() string {
        return s.name
    }
    
    func (s *Smartwatch) IsCharging() bool {
        return s.isCharging
    }
    
    func (s *Smartwatch) Charge() {
        s.isCharging = true
        fmt.Printf("%s wird geladen\n", s.name)
    }
    
    func (s *Smartwatch) GetBatteryLevel() int {
        return s.batteryLevel
    }
    
    func (s *Smartwatch) Play(station string) {
        fmt.Printf("%s is playing %s station\n", s.name, station)
    }
    
    func main() {
    
        var smartWatch *Smartwatch = NewSmartwatch("Galaxy Watch")
        fmt.Printf("Battery level: %d\n", smartWatch.GetBatteryLevel())
        fmt.Printf("Name: %s\n", smartWatch.GetName())
    
        smartWatch.Charge()
        smartWatch.TurnOn()
        smartWatch.Play("New Your 90")
        smartWatch.TurnOff()
    
    }
    Battery level: 50
    Name: Galaxy Watch
    Galaxy Watch wird geladen
    Galaxy Watch wird eingeschaltet.
    Galaxy Watch is playing New York 90 station
    Galaxy Watch wird ausgeschaltet.