Skip to content
EntityQ18224733· pop 8

菱形継承問題

Sign in to save

In the Vinony graph

Within Vinony's link graph, 菱形継承問題 connects to multiple inheritance.

Its subject is documented across 8 Wikipedia language editions.

Article · 日本語

菱形継承問題(ひしがたけいしょうもんだい、英: diamond problem)は、多重継承を伴うオブジェクト指向プログラミング言語において、クラス A を2つのクラス B と C が継承し、B と C の両方をクラス D が継承する際に発生するあいまいさを指す用語である。たとえば、クラス D にあるメソッドが A で定義された(かつ D においてオーバーライドされていない)メソッドを呼び出すとしたとき、B と C がそのメソッドを異なった形でオーバーライドしていたら、D は B と C のどちらのメソッドを継承するのか、という問題がある。 例えば、クラス Button は クラス Rectangle(見た目のため)と Mouse(マウスイベントのため)を継承し、Rectangle も Mouse も Object クラスを継承しているとする。ここで Button オブジェクトが equals メソッドを呼び出し、Button クラス自体にはそのメソッドは定義されていないとする。Rectangle と Mouse にはオーバーライドされた equals メソッドがそれぞれ定義されているとしたら、どちらを呼び出すべきか? これが「菱形; diamond」問題と呼ばれるのは、クラス継承図の形状が菱形になるためである。クラス A が頂上にあり、B と C がそれぞれそこから枝分かれし、D がその2つの枝を再び1つにすることで、全体として菱形を形成する。 いかにも難問のような雰囲気があるが、継承によるオブジェクト指向設計ではごくあたりまえに考えられうる形である。たとえば、ドローソフトにおける各種の図形を扱うクラスを設計している、としよう。「図形」→「四角形」→「平行四辺形」と派生させ、「平行四辺形」から「長方形」や「菱形」を派生させる。ここで「正方形」は長方形であると同時に菱形でもある、という形で菱形継承があらわれる(なお、ここでいう図形の菱形は、英: rhombus であり「ダイヤモンド」ではなく、日本語の偶然である)。またストリームなどでも、「読み出しストリーム」「書き込みストリーム」の両方を継承した「読み書きストリーム」といった形であらわれる。

Abstract from DBpedia / Wikipedia · CC BY-SA

Available in 8 languages

via Wikidata sitelinks · CC0

Connections