Rückblick - Formen-Rechner
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 33 von 107.
Aufgabe
EinfachLassen Sie uns einen Formenkalkulator erstellen, der alle Interface-Konzepte aus diesem Kapitel zusammenführt. Sie werden ein System erstellen, in dem verschiedene geometrische Formen einheitlich über ein gemeinsames Interface verarbeitet werden können, was die Mächtigkeit des Polymorphismus in Go demonstriert.
Sie werden Ihren Code über drei Dateien organisieren:
shape.go: Definieren Sie einShape-Interface mit zwei Methoden:Area() float64undPerimeter() float64. Erstellen Sie außerdem eine Funktion namensDescribeShape, die ein beliebigesShapeakzeptiert und einen formatierten String zurückgibt, der sowohl die Fläche als auch den Umfang anzeigt.shapes.go: Erstellen Sie zwei Structs, die dasShape-Interface implementieren:- Ein
Rectanglemit den FeldernWidthundHeight - Ein
Circlemit einemRadius-Feld
Area()undPerimeter()implementieren, als auch eineString()-Methode (diefmt.Stringerimplementiert), die eine lesbare Beschreibung der Form zurückgibt.- Ein
main.go: Lesen Sie Formdaten aus der Eingabe ein, erstellen Sie die entsprechenden Formen und verwenden Sie IhreDescribeShape-Funktion, um Informationen über jede Form anzuzeigen. Geben Sie außerdem jede Form direkt aus, um dasStringer-Interface zu demonstrieren.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Rechteckbreite (float)
- Zeile 2: Rechteckhöhe (float)
- Zeile 3: Kreisradius (float)
Verwenden Sie für Berechnungen 3.14159 als Wert für Pi. Der Kreisumfang ist 2 * pi * radius.
Ihre String()-Methoden sollten Folgendes zurückgeben:
- Rectangle:
Rectangle(Width x Height) - Circle:
Circle(Radius: R)
Ihre DescribeShape-Funktion sollte Folgendes zurückgeben:
Area: [area], Perimeter: [perimeter]Formatieren Sie alle Float-Werte mit zwei Dezimalstellen unter Verwendung von %.2f.
Zum Beispiel sollte Ihre Ausgabe bei 4, 3 und 5 wie folgt aussehen:
Rectangle(4.00 x 3.00)
Area: 12.00, Perimeter: 14.00
Circle(Radius: 5.00)
Area: 78.54, Perimeter: 31.42Geben Sie zuerst jede Form aus (unter Verwendung ihrer String()-Methode), dann ihre Beschreibung von DescribeShape. Verarbeiten Sie zuerst das Rechteck, 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 Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool