Heim > Backend-Entwicklung > Golang > Kann das Kompositionsmodell von Go immer noch unter dem Problem der fragilen Basisklasse leiden?

Kann das Kompositionsmodell von Go immer noch unter dem Problem der fragilen Basisklasse leiden?

Mary-Kate Olsen
Freigeben: 2024-10-27 12:18:02
Original
967 Leute haben es durchsucht

 Can Go's Composition Model Still Suffer From the Fragile Base Class Problem?

Problem mit fragilen Basisklassen in Go: Trotz Komposition über Vererbung

Das Problem mit fragilen Basisklassen entsteht, wenn Änderungen an einer Basisklasse zu unerwarteten Ergebnissen führen können Verhalten in abgeleiteten Klassen. Dieses Problem wird häufig auf die Vererbung zurückgeführt, bei der abgeleitete Klassen die Methoden und Felder ihrer Basisklassen erben.

In Go ist die Vererbung nicht implementiert. Stattdessen verwendet Go Komposition, wobei eine Struktur Instanzen anderer Strukturen enthalten kann. Einige argumentieren jedoch, dass das fragile Basisklassenproblem in Go immer noch bestehen kann, wenn mit eingebetteten Typen gearbeitet wird.

Eingebettete Typen befördern die Felder und Methoden des eingebetteten Typs zum Wrapper-Typ. Dies ermöglicht zwar einen bequemen Zugriff, eliminiert jedoch Polymorphismus. Dies bedeutet, dass im eingebetteten Typ definierte Methoden im Wrapper-Typ nicht überschrieben werden können und alle vom eingebetteten Typ durchgeführten Methodenaufrufe immer die ursprüngliche Definition aufrufen.

Daher liegt das Problem der fragilen Basisklasse vor in Go in abgeschwächter Form. Änderungen an den Methoden oder Feldern des eingebetteten Typs können sich auf den Wrapper-Typ auswirken, jedoch nur, wenn der Wrapper-Typ keine eigenen Methoden mit denselben Namen definiert.

Beispiel

Betrachten Sie den folgenden Java-Code, in dem eine Basisklasse Counter eine Inkrementierungsmethode inc() und eine Inkrementierungsmethode incBy() enthält. Eine abgeleitete Klasse MyCounter überschreibt inc(), um incBy(1) aufzurufen.

<code class="java">class Counter {
    int value;
    void inc() { value++; }
    void incBy(int n) { value += n; }
}

class MyCounter extends Counter {
    @Override
    void inc() { incBy(1); }
}</code>
Nach dem Login kopieren

Wenn die incBy()-Methode in der Basisklasse so geändert wird, dass sie eine Schleife verwendet, tritt die abgeleitete Klasse MyCounter in eine Endlosschleife ein weil inc() incBy() aufruft, das wiederum inc() aufruft:

<code class="java">void incBy(int n) {
    for (; n > 0; n--) { inc(); }
}</code>
Nach dem Login kopieren

In Go weist dasselbe Beispiel dieses Problem nicht auf, da Go keine überschreibenden Methoden in eingebetteten Typen unterstützt:

<code class="go">type Counter struct { value int }

func (c *Counter) Inc() { c.value++ }
func (c *Counter) IncBy(n int) { c.value += n }

type MyCounter struct { *Counter }

func (m *MyCounter) Inc() { m.IncBy(1) }</code>
Nach dem Login kopieren

Auch wenn die IncBy()-Methode im Counter-Typ so geändert wird, dass sie eine Schleife verwendet, erbt der MyCounter-Typ dieses Verhalten nicht, da er keine Methode namens Inc() definiert. Stattdessen wird die ursprüngliche inc()-Methode aufgerufen, die im Counter-Typ definiert ist.

Daher stellt das fragile Basisklassenproblem in Go aufgrund des fehlenden Polymorphismus in eingebetteten Typen kein großes Problem dar, was unerwartetes Verhalten verhindert beim Ändern eingebetteter Typen.

Das obige ist der detaillierte Inhalt vonKann das Kompositionsmodell von Go immer noch unter dem Problem der fragilen Basisklasse leiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage