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中文网其他相关文章!