Go 語言:脆弱基類問題 - 神話被揭穿?
在物件導向程式設計中,繼承時會出現脆弱基底類別問題類別受到對基底類別所做的變更的影響。當基類使用虛方法時,這個問題變得特別明顯。
儘管 Go 中普遍使用組合而不是繼承,但人們仍然擔心該語言中可能存在脆弱的基類問題。讓我們更深入地研究這個主題。
脆弱基類問題解釋
當修改具有虛擬方法(可重寫方法)的基類時,就會出現脆弱性。如果修改方法的行為取決於虛擬方法的存在,這可能會破壞繼承的類別。
但是,在 Go 中,不存在多態性。當類型嵌入到結構中時,其方法將提升為包裝器結構,但不能覆蓋它們。這意味著嵌入類型中定義的原始方法將始終被呼叫。
Java 和Go 中的示範
為了說明Java 中的脆弱基類問題,請考慮以下範例:
<code class="java">class Counter { void inc() { value++; } void incBy(int n) { value += n; } } class MyCounter extends Counter { @Override void inc() { incBy(1); } }</code>
更改基底類別方法以使用for 迴圈進行增量增加(incBy(int n))會導致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>
即使將Go 中的基類方法修改為有問題的for循環,嵌入類型也不會受到影響,它呼叫基底類別中定義的原始方法。
結論
雖然傳統的脆弱基類問題是像Java 這樣存在虛擬方法的語言中的一個問題,由於缺乏多態性,它在Go 中得到了很大程度的緩解。缺乏虛擬方法可確保嵌入方法始終呼叫基類中定義的原始實現,從而防止與繼承相關的脆弱性問題。
以上是脆弱基類問題是 Go 中的神話嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!