オブジェクト指向は概念です。この概念は、特定のアイデアに基づいています。これらのアイデアの技術的な名前 (実際には時間の経過とともに進化し、最初の 1 時間からは存在しなかった原則) は既に上で与えられているので、それらを繰り返すつもりはありません。私はむしろ、これをできる限り単純かつ非技術的に説明しています。
オブジェクト指向プログラミングの考え方は、オブジェクトがあるということです。オブジェクトは小さな独立したエンティティです。これらのエンティティには、情報が埋め込まれている場合と含まれていない場合があります。彼らがそのような情報を持っている場合、エンティティ自体だけがそれにアクセスしたり変更したりできます。エンティティは、相互にメッセージを送信することで相互に通信します。これを人間と比べてみてください。人間は独立した存在であり、内部データを脳に保存し、通信することで相互に作用します (例: 会話)。他の誰かの脳からの知識が必要な場合、直接アクセスすることはできません。その人に質問をする必要があります。
そして、それは基本的にそれです。これは、オブジェクト指向プログラミングの背後にある本当のアイデアです。これらのエンティティを記述し、それらの間の通信を定義し、それらを相互に作用させてアプリケーションを形成します。この概念はどの言語にも限定されません。これは単なる概念であり、C#、Java、または Ruby でコードを作成する場合、それは重要ではありません。いくつかの追加作業を行うと、この概念は純粋な C で実行することもできます。これは関数型言語ですが、概念に必要なすべてを提供します。
現在、さまざまな言語がこの OO プログラミングの概念を採用しており、もちろん、概念が常に同じというわけではありません。たとえば、一部の言語では、他の言語で禁止されていることを許可しています。関連する概念の 1 つに、クラスの概念があります。クラスがある言語もあれば、ない言語もあります。クラスは、オブジェクトがどのように見えるかの青写真です。オブジェクトの内部データストレージを定義し、オブジェクトが理解できるメッセージを定義し、継承がある場合 ( OO プログラミングでは必須ではありません!)、クラスは他のクラス (多重継承が許可されている場合はクラス) も定義します。このクラスは継承します (選択的継承が存在する場合はどのプロパティも継承します)。このような設計図を作成すると、この設計図に従って無制限の量のオブジェクト ビルドを生成できるようになります。
ただし、クラスを持たないオブジェクト指向言語もあります。オブジェクトはどのように構築されますか? まあ、通常は動的です。たとえば、新しい空のオブジェクトを作成し、インスタンス変数やメソッド (メッセージ) などの内部構造を動的に追加できます。または、既存のオブジェクトをそのすべてのプロパティとともに複製してから、変更することもできます。または、2 つのオブジェクトを新しいオブジェクトにマージすることもできます。クラスベースの言語とは異なり、これらの言語は非常に動的です。開発者がコードを書き始めたときに考えもしなかった方法で、実行時にオブジェクトを動的に生成できるからです。
通常、この動的要素には代償があります。言語が動的になるほど、メモリ (RAM) オブジェクトが浪費され、すべてが遅くなります。プログラム フローも非常に動的であり、機会がなければコンパイラが効果的なコードを生成するのは難しいためです。コードまたはデータ フローを予測します。JIT コンパイラーは、プログラム フローを理解すると、実行時にその一部を最適化できますが、これらの言語は非常に動的であるため、プログラム フローはいつでも変更される可能性があり、JIT はすべてのコンパイル結果を破棄して同じコードを再コンパイルする必要があります。何度も何度も。
しかし、これは小さな実装の詳細であり、基本的なオブジェクト指向の原則とは何の関係もありません。オブジェクトが動的である必要がある、または実行時に変更可能でなければならないということはどこにもありません。ウィキペディアはそれをかなりうまく言っています:
プログラミング技術には、情報の隠蔽、データの抽象化、カプセル化、モジュール性、ポリモーフィズム、継承などの機能が含まれる場合があります。
http://en.wikipedia.org/wiki/オブジェクト指向プログラミング
そうかもしれないし、そうでないかもしれない。これはすべて必須ではありません。必須なのは、オブジェクトの存在と、それらが相互に対話する方法を持っていることだけです (そうでなければ、相互に対話できないオブジェクトはほとんど役に立たないでしょう)。