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>
増分増加 (incBy(int n)) に for ループを使用するように基本クラスのメソッドを変更すると、無限ループにより 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 中国語 Web サイトの他の関連記事を参照してください。