Obwohl die Zusammensetzung wichtiger ist als die Vererbung, kann das Problem mit der fragilen Basisklasse in Go immer noch auftreten, wenn auch in weniger schwerwiegender Form bilden.
Das Problem tritt auf, wenn Änderungen an einer Basisklasse ihre Unterklassen zerstören. In Sprachen mit virtuellen Methoden (wie Java) kann das Überschreiben von Methoden in Unterklassen zu unerwartetem Verhalten führen, wenn die Basisklasse geändert wird.
In Go gibt es jedoch keinen Polymorphismus (überschreibbar). Methoden). Beim Einbetten eines Typs werden die eingebetteten Methoden in die Wrapper-Struktur hochgestuft, können aber nicht überschrieben werden. Dies entschärft das Problem der fragilen Basisklassen, da die geförderten Methoden nicht durch Unterklassen geändert werden können.
In Java:
<code class="java">class Counter { int value; void inc() { value++; } void incBy(int n) { value += n; } } class MyCounter extends Counter { void inc() { incBy(1); } }</code>
Wenn Counter.incBy() wird viele Male in inc() geändert, MyCounter tritt in eine Endlosschleife ein.
In Go:
<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>
Auch mit der gleichen Änderung Wenn Sie Counter.incBy() wie im Java-Beispiel verwenden, funktioniert MyCounter weiterhin korrekt, da Counter.Inc() direkt aufgerufen wird. Die Methoden der Basisklasse bleiben von Änderungen in der Unterklasse unberührt.
Während das Problem der fragilen Basisklasse in Go aufgrund des Fehlens von Polymorphismus weniger verbreitet ist, ist es wichtig, das zu berücksichtigen Mögliche Auswirkungen von Basisklassenänderungen beim Einbetten von Typen in Strukturen.
Das obige ist der detaillierte Inhalt vonMildert das Kompositionsmodell von Go das Problem der fragilen Basisklasse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!