首頁  >  文章  >  後端開發  >  Go 的組合模型是否緩解了脆弱基類問題?

Go 的組合模型是否緩解了脆弱基類問題?

Barbara Streisand
Barbara Streisand原創
2024-10-28 14:16:02106瀏覽

 Does Go's Composition Model Mitigate the Fragile Base Class Issue?

Go 中是否有脆弱基類問題?

儘管採用組合而非繼承,但脆弱基類問題在Go 中仍然可能出現,儘管程度不那麼嚴重

脆弱基類問題

當對基類的變更破壞其子類別時,就會出現此問題。在具有虛擬方法的語言(例如 Java)中,如果修改了基類,則重寫子類中的方法可能會導致意外行為。

然而,在 Go 中,沒有多態性(可重寫方法)。嵌入類型時,嵌入的方法將提升為包裝器結構,但不能被覆蓋。這緩解了脆弱的基類問題,因為子類別無法更改提升的方法。

範例

在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>

如果Counter.incBy() 多次修改為inc(),MyCounter 會進入死循環。

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>

即使修改相同如Java 範例中的Counter.incBy() 所示,MyCounter 仍將正常運行,因為它直接呼叫Counter.Inc()。基類的方法不受子類中任何更改的影響。

結論

雖然由於缺乏多態性,脆弱的基類問題在Go 中不太常見,但重要的是要考慮在結構中嵌入類型時基類更改的潛在影響。

以上是Go 的組合模型是否緩解了脆弱基類問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn