クラスパラダイムに基づいていない オブジェクト指向プログラミング言語 はありますか?
JavaScriptのような言語は プロトタイプに基づく であり、既存のオブジェクトを複製することで動作が再利用されます。私がリンクしたウィキペディアの記事は、Lua、ActionScript、および他の多くの言語がこのパラダイムに従っていることを示しています。
世界で最も人気のあるオブジェクト指向プログラミング言語にはクラスがありません。Javascriptと呼ばれ、プロトタイプベースです: http://en.wikipedia.org/wiki/Prototype-based_programming
オブジェクト指向は、部分的にのみ互いに依存しているいくつかの重要な概念の包括的な用語です。たとえば、継承はクラス間ではなくインスタンス間で個別に宣言できます。または、トーマスが書いたように、クラス全体を具体的なprototype
オブジェクトで表すことができます。インスタンスの作成から構造の説明を分離するのがより一般的です。同様に、レイトバインディングは、名目上同じメソッドを持つオブジェクトが呼び出されたときに必ずしも同じことを行わないこと、および実行時に決定が行われることを意味します。これは、プロトタイプベースのアプローチでも同様に可能です。また、カプセル化は、オブジェクトが宣言されたクラスのインスタンスであるかどうかにかかわらず、基本的に完全に独立しています。
そうは言っても、ほとんどのOO言語はクラスベースの陣営にしっかりと存在します。しかし、それでも、境界を曖昧にするイディオムがあります。ドメイン主導の設計は、特定のアイデンティティがオブジェクトは静的クラス図よりもはるかに重要であり、デコレータを使用すると、同じクラスまたはインターフェイスのオブジェクトが非常に異なる動作を持つことができます。
Fortress は、クラスではなく特性に基づくオブジェクト指向言語です。違いは主に実装構成にあります。オブジェクトの動作(メソッド定義)は、プログラムテキストの特定のポイントでの宣言によって決定されます。つまり、その意味では、クラスベースのシステムに似ています。
純粋にオブジェクトベースのオブジェクト計算(Cardelliによると思います)があります。すべてのメソッドはインスタンスメンバーです。既存のオブジェクトのコンテンツを取得し、そのメンバーの一部を追加、削除、または置き換えることにより、新しいオブジェクトを形成します。新しいオブジェクトには古いオブジェクトへのリンクがなく、そのコンテンツの一部のみであるため、プロトタイプとは少し異なります。
IIRCでは、Pythonおよびその他のハッシュテーブル指向の言語を使用して、同様の方法でプログラミングすることができます。インスタンスメンバーとして関数を追加し、それをメソッドとして呼び出すことができます。
Io は、もう1つのプロトタイプベースのオブジェクト指向言語です。実際には、他の回答ですでに言及されているいくつかの言語からインスピレーションを得ています。
Ioは動的なプロトタイプベースのプログラミング言語です。 Ioのアイデアは、Smalltalk(すべての値はオブジェクト)、Self(プロトタイプベース)、NewtonScript(差分継承)、Act1(同時実行のアクターとフューチャー)、LISP(コードはランタイム検査可能/変更可能ツリー)、およびLua(小さい、埋め込み可能)。
Adaは、1995年の改訂時点でオブジェクト指向ですが、他の多くのOO言語とは異なり、オブジェクト指向の型とモジュールを「クラス」と呼ばれる単一の構成に結合しません"。型を"クラスFoo "として宣言し、関連するすべてのメソッド宣言をクラス宣言内に置くのではなく、packageを宣言し、型を(record
として)宣言します他の言及された言語のように「クラスフリー」ではなく、物事を整理するためのわずかに異なる方法です。
Ada 95のオブジェクト指向機能は、言語の既存の1983バージョンに追加されました。継承などをサポートするために、既存のレコードとパッケージの構成を拡張しました。
アーラン。そしてそうです、Erlang isはオブジェクト指向言語です。OOの定義の3つのポイントすべてを満たしているからです。