オブジェクト指向プログラミングでの抽象化
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/09/09 14:25 UTC 版)
「抽象化 (計算機科学)」の記事における「オブジェクト指向プログラミングでの抽象化」の解説
詳細は「オブジェクト指向プログラミング」を参照 オブジェクト指向プログラミングの理論では、抽象化とは抽象的「アクター」であるオブジェクトを定義する機能であり、アクターは作業を行い、状態を変化させ、状態を報告し、システム内の他のオブジェクトと「通信」する。カプセル化は、状態の詳細を隠蔽することを意味する用語だが、従来のプログラミング言語でのデータ型の概念の拡張である。カプセル化はデータに強く結びついた「振る舞い」をそのデータと関連付け、他のデータ型との相互作用を標準化し、抽象化の起点となる。抽象化をさらに進めて、異なる型のオブジェクト間で同じ操作を定義することをポリモーフィズムと呼ぶ。また、逆方向に抽象化を進め、データ型やクラスの内部を抽象化してそれらの複雑な関係を単純化し構造化することを委譲または継承と呼ぶ。 オブジェクト指向言語は様々あるが、似たような抽象化手法を提供している。ポリモーフィズムはほぼ全てのオブジェクト指向言語でサポートされており、類似あるいは同じ役割を持つデータ型の置換なども含まれる。それほど一般的ではないが、構成・イメージ・パッケージによってコンパイル時/リンク時/ロード時にオブジェクト間の関係を決定することがあり、この場合実行時に関係を決定する必要性がほとんどなくなる。 CLOSやSelfなどの言語では、クラスとインスタンスをあまり区別せず、ポリモーフィズムの実現に委譲をよく使う。また、個々のオブジェクトや関数はより柔軟に抽象化され、LISPの機能により適するようになっている。 C++では、テンプレート、演算子オーバーロード、その他のコンパイル時の静的バインディングなどが特徴であり、これらがC++固有の柔軟性に関する問題を生んでいる。 同じ抽象化にも様々な戦略があるが、基本的に抽象名詞をコード内でサポートする必要性に違いはない。いずれのプログラミング言語も動詞を関数として、名詞をデータ構造として、そして両者を合わせてプロセスとして抽象化する機能に基づいている。 例えば、以下のサンプルコードはJavaによる動物の抽象的表現である。ここでは、飢えと食事という観点で抽象化している。Animalクラスは動物の状態と機能を表現するよう定義されている。 class Animal extends LivingThing { Location loc; double energyReserves; boolean isHungry() { if (energyReserves < 2.5) { return true; } else { return false; } } void eat(Food f) { // Consume food energyReserves += f.getCalories(); } void moveTo(Location l) { // Move to new location loc = l; }} この定義で、Animal型のオブジェクトを生成し、以下のようにメソッドを呼び出すことができる: thePig = new Animal();theCow = new Animal();if (thePig.isHungry()) { thePig.eat(tableScraps); }if (theCow.isHungry()) { theCow.eat(grass); }theCow.moveTo(theBarn); この例では、Animalクラスが動物を抽象化したもので、LivingThing は Animal よりさらに高い抽象度の抽象化(この場合汎化)である。 もっと違った抽象化も考えられる。例えば中間的な抽象化として、毎日ミルクを生み出してくれる動物と、最後に肉となってくれるだけの動物とに分類することができる。DailyAnimal (雌牛や山羊)はミルクを生み出すのに適した餌を与えられ、Animal (豚や雄牛)は肉の質を高める餌を与えられる。 このような抽象化をすれば、アプリケーションを書く人は餌の種類を指定する必要がなくなり、給餌スケジュールに集中することができるようになる。この2つのクラスは継承関係であっても、全く独立していてもよく、それによってポリモーフィズムの度合いも変わってくる。このような機能は言語によって大きく違うが、大体においてある言語でできることは他の言語でも可能である。演算子オーバーロードや抽象データ型を多用することで、継承や他のポリモーフィズムを実現する手法と同様の効果が得られる。クラスを使った記法は単にコードを書くものの利便性のために存在するに過ぎない。
※この「オブジェクト指向プログラミングでの抽象化」の解説は、「抽象化 (計算機科学)」の解説の一部です。
「オブジェクト指向プログラミングでの抽象化」を含む「抽象化 (計算機科学)」の記事については、「抽象化 (計算機科学)」の概要を参照ください。
- オブジェクト指向プログラミングでの抽象化のページへのリンク