首頁  >  文章  >  後端開發  >  脆弱基類問題是 Go 中的神話嗎?

脆弱基類問題是 Go 中的神話嗎?

DDD
DDD原創
2024-11-02 14:31:30291瀏覽

Is the Fragile Base Class Issue a Myth in Go?

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中文網其他相關文章!

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