Schnittstellen in Go ermöglichen Polymorphismus, sodass Sie generische Typen erstellen können, die mit jedem Typ funktionieren können, der diese Schnittstellen implementiert. Im Gegensatz zu Sprachen wie Java oder C unterstützt Go jedoch keine Mehrfachvererbung. Dies wirft die Frage auf, wie bestimmte Entwurfsmuster erreicht werden können, beispielsweise die Verwendung eines Typs, der zwei Schnittstellen „implementieren“ soll, ohne Vererbung.
Um Ihren Strukturtyp auszublenden und darzustellen es als Schnittstelle:
type Card interface { GetFace() string GetSuit() string }
Sie möchten auch eine String()-Methode für Ihre Kartenschnittstelle definieren, dies stellt jedoch eine Herausforderung dar, da Sie keine Schnittstelle an die übergeben können Implementierung der String()-Methode.
Anstatt das Anti-Pattern zu verwenden, Ihre Struktur zu verbergen und nur die Schnittstelle zu exportieren, sollten Sie den folgenden Ansatz in Betracht ziehen:
Verstecken Sie Ihre Strukturfelder, um externe Änderungen zu verhindern, aber exportieren Sie einen Zeiger auf it:
type Card struct { // ... struct fields here } func NewCard(...) *Card { // ... }
Definieren Sie eine String()-Methode für den Zeiger auf Ihre Kartenstruktur:
func (c *Card) String() string { // ... }
Dieser Ansatz ermöglicht Ihnen Folgendes:
Während das Muster „Schnittstellenversteckung“ auf den ersten Blick erscheinen mag Wenn sie ansprechend sind, kann dies zu einer schlechten Kapselung führen, die Dokumentation beeinträchtigen und zu unnötiger Komplexität führen. Der empfohlene Ansatz, einen Zeiger auf die Struktur zu exportieren und die String()-Methode für den Zeigertyp zu implementieren, bietet eine sauberere und effektivere Lösung.
Das obige ist der detaillierte Inhalt vonWie kann ich Methoden auf Go-Schnittstellen ohne Mehrfachvererbung effektiv implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!