3

免責事項abstract class:これはesとsの違いを理解することについての質問ではありませんinterface。それがわからない場合は、タイトルをもう一度読んでください。私は契約と半分実装されたサブシステムの違いに精通しています。)

ほんの一例としてJavaを取り上げましょう。interface開発者としての私の観点から、コンパイラがまったく同じものを吐き出すとき、明確なキーワードの必要性はほとんどないようです。人間の言葉で言えば、「(implementsまたはを介してextends)派生するま​​でこれを利用することはできません。そのメソッドを実装する新しいクラス」。単純。

しかし、これら2つの混同を防ぐ可能性のあるシナリオが1つあります。Javaでは多重継承が許可されていないため(esの場合) 、implement複数の継承が必要な場合。確かに、コンパイラがメソッド本体または宣言された変数があることを認識し、その後、必要に応じてマルチ/を禁止するような方法で言語を構築するのは簡単です。次に、優先順位に問題がありますか?interfaceclassimplementsextends

これが、この構文上の違いがある唯一の理由ですか?

PS私がこの質問をする理由の1つは、このシナリオは新しいOOプログラマーにとって理解するのにかなりの課題を提示する可能性があることです。これを言語レベルでより合理化された方法で処理すると、概念の違いをより迅速に把握するのに大いに役立つと思います。 。

4

1 に答える 1

2

確かに、コンパイラがメソッド本体または宣言された変数があることを認識し、その後、必要に応じて複数の実装/拡張を禁止するような方法で言語を構築するのは簡単です。

あなたがそれをしたとしましょう。したがって、あなたの言語ではこれを行うことができます:

class Foo extends A, B, C {
}

そして、すべてのメソッドが抽象的Bである限り、文句を言うことはありません。C上品でダンディ。

ここで、を作成しなかったとしましょうB。他の誰かが書いた他のパッケージにあります。彼らはあなたのクラスについて何も知りませんFoo。彼らが作ったときB、その中のすべては抽象的なものでしたが、それは単なる偶然でした。彼らはまだそこに入れる具体的なものを何も持っていませんでした。

後で、彼ら具体的な別のメソッドをBに追加することにしました。今、気づかずに、彼らはあなたのクラスを壊しました。Foo

明示的な構成を持つことの1つの議論は、それを消費する誰かに明確なinterface作者の意図を与えるということです。B

一般的に、あなたの質問は良い質問だと思います。私が取り組んでいる言語であるDartは、実際にはあなたが話している言語に近いものです。interface現在、明示的な構文がありますが、純粋な抽象クラスのために削除されています。

于 2012-07-31T17:28:32.447 に答える