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.
// 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.
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.