Rückblick – Formenrechner
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 33 von 107.
Aufgabe
EinfachWir erstellen einen Formrechner, der alle Schnittstellenkonzepte aus diesem Kapitel zusammenführt. Du erstellst ein System, in dem verschiedene geometrische Formen einheitlich über eine gemeinsame Schnittstelle verarbeitet werden können, und demonstrierst damit die Leistungsfähigkeit des Polymorphismus in Go.
Du organisierst deinen Code auf drei Dateien verteilt:
shape.go: Definiere eineShape-Schnittstelle mit zwei Methoden:Area() float64undPerimeter() float64. Erstelle außerdem eine Funktion namensDescribeShape, die eine beliebigeShapeakzeptiert und eine formatierte Zeichenkette zurückgibt, die sowohl deren Fläche als auch deren Umfang anzeigt.shapes.go: Erstelle zwei Strukturen, die dieShape-Schnittstelle implementieren:- Ein
Rectanglemit den FeldernWidthundHeight - Ein
Circlemit dem FeldRadius
Area()undPerimeter()als auch eineString()-Methode implementieren (wodurchfmt.Stringerimplementiert wird), die eine lesbare Beschreibung der Form zurückgibt.- Ein
main.go: Lies Formdaten aus der Eingabe, erstelle die entsprechenden Formen und verwende deine FunktionDescribeShape, um Informationen zu jeder Form anzuzeigen. Gib außerdem jede Form direkt aus, um dieStringer-Schnittstelle zu demonstrieren.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Breite des Rechtecks (Gleitkommazahl)
- Zeile 2: Höhe des Rechtecks (Gleitkommazahl)
- Zeile 3: Radius des Kreises (Gleitkommazahl)
Verwende für die Berechnungen 3.14159 als Wert von Pi. Der Umfang des Kreises ist 2 * pi * radius.
Deine String()-Methoden sollen Folgendes zurückgeben:
- Rechteck:
Rectangle(Width x Height) - Kreis:
Circle(Radius: R)
Deine Funktion DescribeShape soll Folgendes zurückgeben:
Area: [area], Perimeter: [perimeter]Formatiere alle Gleitkommawerte mit zwei Dezimalstellen mithilfe von %.2f.
Wenn beispielsweise 4, 3 und 5 angegeben werden, sollte deine Ausgabe folgendermaßen aussehen:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42Gib zuerst jede Form aus (mithilfe ihrer String()-Methode) und anschließend ihre Beschreibung aus DescribeShape. Verarbeite zuerst das Rechteck und dann den Kreis.
Probier es selbst
package main
import (
"fmt"
)
func main() {
// Eingabewerte lesen
var width, height, radius float64
fmt.Scanln(&width)
fmt.Scanln(&height)
fmt.Scanln(&radius)
// TODO: Erstelle ein Rectangle mit der angegebenen Breite (width) und Höhe (height)
// TODO: Erstelle einen Circle mit dem angegebenen Radius
// TODO: Gib das Rechteck aus (verwendet die String() Methode)
// TODO: Gib die Beschreibung des Rechtecks mit DescribeShape() aus
// TODO: Gib den Kreis aus (verwendet die String() Methode)
// TODO: Gib die Beschreibung des Kreises mit DescribeShape() aus
}
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