継承はサブタイプとどのように異なりますか?


15

プログラミング言語の観点では、サブタイピングとはどういう意味ですか?「継承はサブタイピングではない」と聞きました。それでは、継承とサブタイピングの違いは何ですか?


6
この質問(およびそれに似た他の質問)がパブリックベータ版に入ると、新しいcs.SEサイトにリダイレクトされるのではないかと思いますか?
スレシュヴェンカト

1
理論的コンピューターサイエンス(TCS)の研究レベルの質問に関するQ&Aサイトであるcstheoryへようこそ。あなたの質問は、TCSの研究レベルの質問ではないようです。これが何を意味するのか、また質問を歓迎する可能性のあるサイトの提案については、FAQを参照してください。最後に、質問が範囲外であるため閉じられており、質問を編集して研究レベルの質問にできると思われる場合は、お気軽にお問い合わせください。終了は恒久的なものではなく、質問を再度開くことができます。詳細については、FAQ参照してください。
Kaveh

3
@UdayReddy:最初に答えたとき、簡単な質問ではありませんでしたが、現代の観点から決定する必要があります。あなたと同じ議論は、ダイクストラのアルゴリズムについての質問が話題になっていることを暗示しているでしょう。なぜなら、最初の論文ではそれについてだけ話しているからです。
伊藤剛

3
@TsuyoshiItoダイクストラの最初の論文が問題を解決したのに対し、ここでのカーデリの最初の論文が問題を作成したので、類推は適切ではありません。それでも、最初の論文に基づいて最新技術を測定するものではないという点を指摘します。継承とサブタイピングの違いは解決された問題を表すものではないことを保証します。少なくとも20年はこの問題が議論されると予想しています。質問者は、追加の宿題をして質問を編集し、研究レベルの問題を明確にすることを勧められる場合があります。
Uday Reddy

3
いずれの場合でも、OPをクックなどの同名の論文に向けるのは簡単
Andreas Rossberg

回答:


18

[オブジェクト指向型システムの問題について深く考えたことはありませんが、議論を進めるために知っていることを述べます。]

ABABAB

AB

タイプの構造は偶発的な理由で一致する可能性があるため、構造的なサブタイピングでは動作のサブタイピングが保証されません。ただし、予想される動作を定義するのは簡単ではありません。そのため、多くのプログラミング言語では、ユーザーがどの型がどのサブタイプであるかを宣言する必要がある中間点を使用します。これは、「名義サブタイピング」と呼ばれます。暗黙的サブタイプと明示的サブタイプに関する質問を参照してくださいこの問題の議論のため。アイデアは、プログラマーが自分の工夫を使用して、宣言されたすべてのサブタイプの動作サブタイプを確認する必要があるということです。この言語はヘルプを提供できません。ただし、宣言されたすべてのサブタイプは、少なくとも構造的なサブタイプでなければなりません。そうしないと、プログラムは型チェックに失敗します。言語はこれを保証するのに役立ちます。(一部のプログラミング言語には、コンパイル時にこれを保証するのに十分な型システムがありません。その場合、実行時に型障害が検出されるか、間違った結果が生成される可能性があります。

オブジェクト指向プログラムでサブクラスを定義するとき、一般に公開されているフィールド(またはメソッド)を追加します。ほとんどのプログラミング言語では、このようなサブクラスは名目上のサブタイプと見なされます。問題は、それらが構造サブタイプでもあるかどうかです。そうでない場合、つまりプログラミング言語で、構造サブタイプではない名目上のサブタイプを宣言できる場合、プログラミング言語にタイプホールが存在します。

単純な場合、フィールドの追加は正常に機能します。スーパークラスのタイプは、サブクラスのタイプよりも少ないフィールドを想定しています。そのため、sueprclassのインスタンスが予期されるサブクラスのインスタンスをプラグインすると、プログラムは提供された追加フィールドを無視し、何も問題が発生しません。

ただし、スーパークラスまたはサブクラスに、それ自体と同じ型の引数を取るメソッドがある場合、または同じ型の結果を返すメソッドがある場合、問題が発生します。その場合、サブクラスのインターフェイスタイプは、スーパークラスのインターフェイスタイプの構造的なサブタイプではありません。Javaなどの広く使用されているタイプセーフプログラミング言語では、このようなサブクラスは許可されません。そのため、型安全性を得るために言語を制限します。プログラミング言語Eiffelは、代わりに柔軟性を得るために型安全性を犠牲にしたと言われています。柔軟性を保持する強力な型システムを設計する場合、サブクラスがサブタイプを生成するという原則を放棄する必要があります。したがって、論文のタイトルは「継承はサブタイプではありません」。著者は、代わりに機能する高次サブタイピングの異なる概念を提案しています。キム・ブルースには、同じ効果を達成する「マッチング」と呼ばれる密接に関連した提案もあります。このプレゼンテーションを参照してください。Andrew Blackのポジションペーパーも役立ちます。

セマンティックスコミュニティは、おそらく問題をほとんど無視していることのせいです。私たちは伝統的に、理論的にほとんど関心のない実用的な型システム工学の問題だと考えてきました。それが当てはまらず、その分野で実際にいくつかのセマンティクスが機能している場合、他の人々がそれらに言及することを望みます。


1
また、オブジェクトシステムのOcamlなど、継承からサブタイピングを正常に分離した実際の言語があることにも言及する価値があります。
アンドレアスロスバーグ

@AndreasRossberg実際、私がその答えを書いたとき、OCamlは私のフレームにはいませんでした。OCamlには名目上のサブタイプはまったくないと思います。したがって、これらの問題のいくつかは発生しません。しかし、振る舞いが一致しない場合でも、型が誤って一致する可能性があり、型システムはその種の間違いを見つけるのを助けることができません。
ウダイレディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.