web-dev-qa-db-ja.com

オブジェクト指向言語とオブジェクトベース言語の中心的な違い

中核的な違いは何かを知りたい

オブジェクト指向言語とオブジェクトベース言語

私はそれらのすべてが2つのことを言っている多くの投稿を読みました

  1. オブジェクト指向言語はOOPのすべての機能をサポートし、オブジェクトベースの言語は多態性や継承などのOOPのすべての機能をサポートしていません。

  2. 彼らはオブジェクトベースとしてのJavaScriptの例を提供し、オブジェクト指向としてJava

このstackoverflowの投稿のように

オブジェクト指向言語とオブジェクトベース言語の違い

しかし、言語に関係なく両方の概念の中心的な違いは何かを知りたいです。

答えを得た

ついに物を得た

Matías Fidemraizerに感謝

どの言語にも依存せず、どの機能にも依存しない回答、私が探しているコアの違いは

それ自体がオブジェクトを含む言語はオブジェクトベースの言語と呼ばれ、オブジェクト指向の概念に従う言語はオブジェクト指向言語として知られています

32
user2164685

JavaScriptはプロトタイプ指向の言語です。

コンストラクター関数から実際のオブジェクトを構築できます。また、どのオブジェクトにも可能なほぼすべての機能があります。

  • コンストラクタ。
  • メソッド(つまりJavaScriptの関数)。
  • プロパティ(ECMA-Script 5、「getters/setters」以降)。
  • インスタンス。

JavaScriptでは、オブジェクトにはprototypeがあり、これにはfunctionsが含まれます。プロトタイプ自体は、オブジェクトメンバの新しく作成されたインスタンスにオブジェクトメンバを追加する基本的な方法です。

var constructor = function() { };
constructor.prototype.text = "hello world";

alert(new constructor().text); // This alerts hello world

JavaScriptがオブジェクト指向プログラミング(スクリプト)言語ではない理由オブジェクト指向プログラミングの定義の要件に適合する機能がないためです。

  • 多態性いいえ。プロトタイプメンバーの動作を変更できますが、これは識別子を再利用しているだけです。 疑似派生オブジェクト内のメンバーの以前の実装にアクセスすることはできません。
  • 継承まったくない。プロトタイプチェーンは継承に匹敵するかもしれませんが、JavaScript(ECMA-Script 5.x以前のバージョン)には、他のOOPベースの言語(Java、C#、Ruby、Python、VisualBasic.NETなど)のような構文ベースの継承はありません... )。
  • カプセル化。はい、もちろんですが、実際のプライベートまたは内部オブジェクトメンバーを作成する方法はありません。

おそらく他の詳細について言及するのを忘れていましたが、これは良い要約だと正直に信じています。

更新と概要

核となる違いは、オブジェクト指向プログラミング言語には、オブジェクト指向プログラミング言語と見なされるためにオブジェクト指向パラダイムが持たなければならない機能があるということです。 したがって、現時点ではJavaScriptは実際のオブジェクト指向プログラミング言語ではありません。実際のポリモーフィズムと継承がないためです

更新:ES2015以降は状況を変えましたか?

ES2015以上は、厳密に言えば、オブジェクト指向プログラミングに完全ではなく、より近いものを考慮する大きな改善点を持っています。スーパークラスを呼び出す構文糖衣

例えば:

class A {
     doStuff() {
         console.log("hello world");
     }
}

class B extends A {
     doStuff() {
         super.doStuff();
         console.log("...and goodbye!");
     }
}

これはpolymorphismです。より特化したクラスは、その基本クラスをオーバーライドして、関数の動作を完全に変更するか、基本が既に行っていたことを実行して、関数に新しいコードを追加することができます。

BTW、ES2015以上にはまだ真のカプセル化が欠けています:ここでprivatepublicなどのアクセス修飾子はどこですか?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をオブジェクト指向プログラミングを完全にサポートする別の言語と見なすことができるので、この回答を再度更新する必要があることを願っています!

25

オブジェクトベース言語には、基本的に、オブジェクトを簡単に作成して使用する組み込み機能を提供する任意の言語が含まれます。 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などの他の言語では、好きなオブジェクトを渡すことができます。オブジェクトが適切なインターフェイスを提供する限り、オブジェクトの種類は正確には関係ありません。これは「ダックタイピング」と呼ばれ、存在する最も純粋な多型の形です。

17
cHao

オブジェクトを使用するだけでは、完全にOO言語でもOOテクニックを実装していない場合はオブジェクトベースのプログラミングです。

4
LarrySTS

ざっと...

  • オブジェクト指向:カプセル化、継承、多態性をサポート
  • オブジェクトベース:カプセル化をサポート

Wikipedia-オブジェクトベース言語

0
dthal

OOPとOBPは、異なる原則に従うプログラミング言語の一種です。

[〜#〜] oop [〜#〜]:多態性、継承、カプセル化(PIE)に従います。

  • :Java、.Netなど。 OOPはOBPと比較して新しい

[〜#〜] obp [〜#〜]:ポリモーフィズムとカプセル化に従います。

  • :Ada、Visual Basic(VB)、およびFortran90。OBPは古い
0
Premraj

プログラミング言語が真のオブジェクト指向言語であるために準拠しなければならない4つの主要な要素があります。これらは、抽象化、カプセル化、モジュール性および階層です。

ただし、最初のthere要素をサポートする場合は、言語オブジェクトベースを呼び出すことができます。プログラミング言語がオブジェクトの概念をサポートするとすぐに、オブジェクトの固有の機能である最初の3つの要素をサポートします。

言語としてのJavaScriptは、オブジェクト指向ではなく、階層(特に継承)をサポートしないため、オブジェクトベースの言語とは言えません。

0
Arnab