Rückblick – Mitarbeiterhierarchie
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 40 von 107.
Aufgabe
EinfachErstellen wir ein Hierarchiesystem für Mitarbeiter eines Unternehmens, das zeigt, wie Komposition reale Organisationsstrukturen elegant modelliert. Du erstellst einen grundlegenden Mitarbeitertyp, den spezialisierte Rollen mit ihrem eigenen, individuellen Verhalten erweitern können.
Du strukturierst deinen Code über drei Dateien:
employee.go: Erstelle die Grundlage mit einerEmployee-Struktur, die die FelderID,NameundBaseSalary(float64) enthält. Gib ihr zwei Methoden:Info() string, die[ID] [Name]zurückgibtCalculateBonus() float64, die 10 % des Grundgehalts zurückgibt
roles.go: Erstelle zwei spezialisierte Mitarbeitertypen, dieEmployeeeinbetten:Managermit einemTeamSize-Feld (int): Manager erhalten einen höheren Bonus: 20 % des Grundgehalts plus 100 $ pro Teammitglied. Überschreibe dieCalculateBonus-Methode, um dies zu implementieren.Developermit einemLanguage-Feld (string): Entwickler behalten den Standardbonus bei, überschreiben aber dieInfo-Methode, um ihre Programmiersprache anzuhängen:[ID] [Name] ([Language])
main.go: Lies die Mitarbeiterdaten aus der Eingabe ein, erstelle einen Manager und einen Entwickler und gib anschließend die Informationen und den berechneten Bonus jedes Mitarbeiters aus.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Manager-ID
- Zeile 2: Name des Managers
- Zeile 3: Grundgehalt des Managers (float64)
- Zeile 4: Teamgröße des Managers (Ganzzahl)
- Zeile 5: Entwickler-ID
- Zeile 6: Name des Entwicklers
- Zeile 7: Grundgehalt des Entwicklers (float64)
- Zeile 8: Programmiersprache des Entwicklers
Gib für jeden Mitarbeiter die Informationen aus, gefolgt vom Bonus in der nächsten Zeile. Formatiere die Boni mit zwei Dezimalstellen.
Wenn beispielsweise M001, Sarah Chen, 80000, 5, D001, Alex Rivera, 65000 und Go eingegeben werden, sollte deine Ausgabe folgendermaßen aussehen:
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00Beachte, wie sich die Bonusberechnung des Managers (20 % von 80000 + 5×100 = 16500) vom Standardbonus des Entwicklers von 10 % unterscheidet, während der Entwickler die Darstellung seiner Informationen anpasst. Beide Typen haben weiterhin Zugriff auf die eingebetteten Employee-Felder und können bei Bedarf die ursprünglichen Methoden aufrufen.
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Manager-Details lesen
managerID, _ := reader.ReadString('\n')
managerID = strings.TrimSpace(managerID)
managerName, _ := reader.ReadString('\n')
managerName = strings.TrimSpace(managerName)
managerSalaryStr, _ := reader.ReadString('\n')
managerSalary, _ := strconv.ParseFloat(strings.TrimSpace(managerSalaryStr), 64)
teamSizeStr, _ := reader.ReadString('\n')
teamSize, _ := strconv.Atoi(strings.TrimSpace(teamSizeStr))
// Developer-Details lesen
devID, _ := reader.ReadString('\n')
devID = strings.TrimSpace(devID)
devName, _ := reader.ReadString('\n')
devName = strings.TrimSpace(devName)
devSalaryStr, _ := reader.ReadString('\n')
devSalary, _ := strconv.ParseFloat(strings.TrimSpace(devSalaryStr), 64)
devLanguage, _ := reader.ReadString('\n')
devLanguage = strings.TrimSpace(devLanguage)
// TODO: Erstelle einen Manager mit den gelesenen Werten
// Hinweis: Verwende Komposition - Manager bettet Employee ein
// TODO: Erstelle einen Developer mit den gelesenen Werten
// Hinweis: Verwende Komposition - Developer bettet Employee ein
// TODO: Gib Manager-Info und Bonus aus (Bonus auf 2 Dezimalstellen formatiert)
// Verwende fmt.Printf mit "%.2f" zur Formatierung
// TODO: Gib Developer-Info und Bonus aus (Bonus auf 2 Dezimalstellen formatiert)
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP in Go
Externe DateienGo-Workspace & ModulePackages & ImportsExportierte vs. nicht exportierte NamenEinführung in OOP mit GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktorfunktionenRückblick – Einfacher Taschenrechner4Schnittstellen
Einführung in SchnittstellenImplizite ImplementierungSchnittstelle als VertragLeere Schnittstelle (any)TypzusicherungTypwechselZusammensetzung von SchnittstellenStringer- und Error-SchnittstellenRückblick – Formenrechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf PaketebeneGetter- und Setter-MethodenInformationsverbergung in GoRückblick – Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterTypbeschränkungenGenerische StrukturenWorkaround für generische MethodenZusammenfassung – Generische Sammlung2Typen & Structs im Detail
Grundlegende & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct-TagsAnonyme StructsVerschachtelte StructsNullwerte & StandardwerteRückblick – Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen der Struct-EinbettungMethoden-PromotionMehrere Structs einbettenEinbettung vs. AggregationVerbergen eingebetteter MethodenRückblick – Mitarbeiterhierarchie8Fehlerbehandlung & OOP
Das Error-InterfaceBenutzerdefinierte FehlertypenError-Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverRückblick – Dateiparser3Zeiger & Speicher
Grundlagen von Zeigern in GoZeiger auf StructsÜbergabe per Wert vs. ReferenzDie Funktion new()Garbage Collection in GoRückblick – Verkettete Liste erstellen6Polymorphismus in Go
Polymorphismus über InterfacesDuck-Typing in GoRegeln zur Interface-ErfüllungPolymorphe SammlungenDependency InjectionZusammenfassung – Zahlungsprozessor9Konkurrenz & OOP
Grundlagen der GoroutinesChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignRückblick – Worker PoolÜbe selbstständig: Online-Go-Compiler