中核的な違いは何かを知りたい
オブジェクト指向言語とオブジェクトベース言語
私はそれらのすべてが2つのことを言っている多くの投稿を読みました
オブジェクト指向言語はOOPのすべての機能をサポートし、オブジェクトベースの言語は多態性や継承などのOOPのすべての機能をサポートしていません。
彼らはオブジェクトベースとしてのJavaScriptの例を提供し、オブジェクト指向としてJava
このstackoverflowの投稿のように
しかし、言語に関係なく両方の概念の中心的な違いは何かを知りたいです。
答えを得た
ついに物を得た
Matías Fidemraizer
に感謝
どの言語にも依存せず、どの機能にも依存しない回答、私が探しているコアの違いは
それ自体がオブジェクトを含む言語はオブジェクトベースの言語と呼ばれ、オブジェクト指向の概念に従う言語はオブジェクト指向言語として知られています
JavaScriptはプロトタイプ指向の言語です。
コンストラクター関数から実際のオブジェクトを構築できます。また、どのオブジェクトにも可能なほぼすべての機能があります。
JavaScriptでは、オブジェクトにはprototypeがあり、これにはfunctionsが含まれます。プロトタイプ自体は、オブジェクトメンバの新しく作成されたインスタンスにオブジェクトメンバを追加する基本的な方法です。
var constructor = function() { };
constructor.prototype.text = "hello world";
alert(new constructor().text); // This alerts hello world
JavaScriptがオブジェクト指向プログラミング(スクリプト)言語ではない理由オブジェクト指向プログラミングの定義の要件に適合する機能がないためです。
おそらく他の詳細について言及するのを忘れていましたが、これは良い要約だと正直に信じています。
核となる違いは、オブジェクト指向プログラミング言語には、オブジェクト指向プログラミング言語と見なされるためにオブジェクト指向パラダイムが持たなければならない機能があるということです。 したがって、現時点ではJavaScriptは実際のオブジェクト指向プログラミング言語ではありません。実際のポリモーフィズムと継承がないためです。
ES2015以上は、厳密に言えば、オブジェクト指向プログラミングに完全ではなく、より近いものを考慮する大きな改善点を持っています。スーパークラスを呼び出す構文糖衣。
例えば:
class A {
doStuff() {
console.log("hello world");
}
}
class B extends A {
doStuff() {
super.doStuff();
console.log("...and goodbye!");
}
}
これはpolymorphismです。より特化したクラスは、その基本クラスをオーバーライドして、関数の動作を完全に変更するか、基本が既に行っていたことを実行して、関数に新しいコードを追加することができます。
BTW、ES2015以上にはまだ真のカプセル化が欠けています:ここでprivate
やpublic
などのアクセス修飾子はどこですか?Nowhere 。
そして、最終的に、ES2015以降はクラスベースのOOPを実装しますが、それでもECMAScript 5.xの上にある構文上のシュガーレイヤーです...上記のコードはまだプロトタイプで動作しますフードの下で、ECMAScript 5.xでコーディングする場合と同じように機能します。
function A() {
}
A.prototype.doStuff = function() {
console.log("hello world");
};
function B() {
}
B.prototype = Object.create(A.prototype);
B.prototype.doStuff = function() {
A.prototype.doStuff.call(this);
console.log("...and goodbye!");
};
ES2020がすでにアクセス修飾子を提案しており、JavaScriptをオブジェクト指向プログラミングを完全にサポートする別の言語と見なすことができるので、この回答を再度更新する必要があることを願っています!
オブジェクトベース言語には、基本的に、オブジェクトを簡単に作成して使用する組み込み機能を提供する任意の言語が含まれます。 1つの主要な基準があります。
カプセル化オブジェクトにはAPIがアタッチされており、通常は何をするかを伝えることでオブジェクトを操作する方法でその上でいくつかの機能を実行するより。
ほとんどのオブジェクトベース言語は、基本的にオブジェクトの設計図である「クラス」の観点からオブジェクトを定義します。このクラスは、オブジェクトの内部構造をレイアウトし、APIを定義します。
ただし、これが唯一の方法ではありません。たとえばJavaScriptでは、オブジェクトには実際には「クラス」がありません。どのオブジェクトにも、必要なプロパティを設定できます。また、関数はJavaScriptのファーストクラスの値であるため、オブジェクトのプロパティとして設定でき、オブジェクトのAPIとして機能します。
オブジェクトベースではあるがオブジェクト指向ではない言語に関する限り、良い例はVisual Basic(.netのものではなく、VB6とVBAについて話している)です。クラスは存在しますが、相互に継承することはできません。
オブジェクト指向言語は、物事をさらに一歩進めるオブジェクトベースの言語です。 OOPの他の2つの柱のサポートが組み込まれています。
継承オブジェクトには、他のオブジェクトの特殊化(および表示)の機能が必要です。これは、たとえば、「犬」を「スティックを鳴らしてフェッチできる動物」として定義できることを意味します。
現代の言語では、通常、あるオブジェクトのclass別のオブジェクトのclass。ただし、これは要件ではありません。一部の人々があなたに伝えようとすることとは反対に、OOPの定義はクラスをまったく必要としません。
多態性コードは、オブジェクトの種類を正確に認識または気にせずにオブジェクトを使用できる必要があります。
ほとんどの言語(特に静的に型付けされた言語)は、クラスと継承の観点からポリモーフィズムを定義します。 Aを継承するクラスBがある場合、Aへの参照を必要とするコードは通常Bを代わりに使用できますが、Aに関連しないクラスCは使用できません。Javaまたinterface
キーワードを使用して、クラスが実装する必要がある一連の動作を定義できます。クラスが明示的にimplements X
、したがってインターフェイスXで定義された関数を実装し、タイプXのインスタンスとして修飾されます。
JavaScriptなどの他の言語では、好きなオブジェクトを渡すことができます。オブジェクトが適切なインターフェイスを提供する限り、オブジェクトの種類は正確には関係ありません。これは「ダックタイピング」と呼ばれ、存在する最も純粋な多型の形です。
オブジェクトを使用するだけでは、完全にOO言語でもOOテクニックを実装していない場合はオブジェクトベースのプログラミングです。
OOPとOBPは、異なる原則に従うプログラミング言語の一種です。
[〜#〜] oop [〜#〜]:多態性、継承、カプセル化(PIE)に従います。
[〜#〜] obp [〜#〜]:ポリモーフィズムとカプセル化に従います。
プログラミング言語が真のオブジェクト指向言語であるために準拠しなければならない4つの主要な要素があります。これらは、抽象化、カプセル化、モジュール性および階層です。
ただし、最初のthere要素をサポートする場合は、言語オブジェクトベースを呼び出すことができます。プログラミング言語がオブジェクトの概念をサポートするとすぐに、オブジェクトの固有の機能である最初の3つの要素をサポートします。
言語としてのJavaScriptは、オブジェクト指向ではなく、階層(特に継承)をサポートしないため、オブジェクトベースの言語とは言えません。