儘管採用組合而非繼承,但脆弱基類問題在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中文網其他相關文章!