首页  >  文章  >  后端开发  >  脆弱基类问题是 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