http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L08-abstraction/08_abstraction.html抽象クラス対抽象クラス
抽象化には2つの味があります。 1つは関数抽象化であり、もう1つはデータ抽象化です。しかし、抽象クラスはどこに適合しますか?私が見ている限り、抽象クラスはまったく異なる概念であり、名前はOOPの原則と関係があることを示していますが、
誰かがこれにいくつかの光を当てることができますか?
http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L08-abstraction/08_abstraction.html抽象クラス対抽象クラス
抽象化には2つの味があります。 1つは関数抽象化であり、もう1つはデータ抽象化です。しかし、抽象クラスはどこに適合しますか?私が見ている限り、抽象クラスはまったく異なる概念であり、名前はOOPの原則と関係があることを示していますが、
誰かがこれにいくつかの光を当てることができますか?
Wikiは非常に正確にそれを置く
データの抽象化
データ抽象データ型の抽象プロパティとその実装の具体的な内容との間に明確な分離を強制します。抽象的なプロパティは、データ型(データ型へのインタフェース)を使用するクライアントコードで参照可能なものであり、具体的な実装は完全にプライベートに保たれ、実際には時間の経過とともに効率性の向上などの変更が可能です。そのような変更は、抽象的な振る舞いに違いがないため、クライアントコードに影響を与えるものではないと考えられています。 例えば、キーを値と一意に関連づけ、対応するキーを指定することによって値を取り出すことができるルックアップテーブルと呼ばれる抽象データ型を定義することができる。そのようなルックアップテーブルは、ハッシュテーブル、バイナリ検索ツリー、または(キー:値)対の単純な線形リストなど、様々な方法で実装することができる。クライアントコードに関する限り、型の抽象プロパティは各ケースで同じです。
たとえば、いくつかの一般的なファームの "動物"を、飢えや摂食の単純な側面をモデル化するのに適した抽象レベルにするためのサンプルJavaフラグメントを考えてみましょう。一つの型動物のオブジェクトを作成し、このようにそれらのメソッドを呼び出すことができ、上記の定義と
public class Animal extends LivingThing
{
private Location loc;
private double energyReserves;
public boolean isHungry() {
return energyReserves < 2.5;
}
public void eat(Food f) {
// Consume food
energyReserves += f.getCalories();
}
public void moveTo(Location l) {
// Move to new location
loc = l;
}
}
:
thePig = new Animal();
theCow = new Animal();
if (thePig.isHungry()) {
thePig.eat(tableScraps);
}
if (theCow.isHungry()) {
theCow.eat(grass);
}
theCow.moveTo(theBarn);
それが動物の状態とその機能の両方を表すために、動物のクラスを定義します一般にオブジェクトは機能とデータを結合し、抽象クラスもその例外ではありません。場合によっては、提供される抽象化はほぼ純粋なデータであり、データ(例えば、コレクションクラス)へのアクセスのみを提供する。他のケースはほぼ逆です(たとえば、C++のファンクタによって提供される抽象化は、通常はかなり機能的です)。
これらはもちろん、ほとんどの極端なものです - 多くの(ほとんどの)クラスはそれらの間のどこかにあります。
これは私の主張です。しかし、抽象クラスと抽象的な概念について、それらの2つが同じかどうかについては言及していませんか? – crowso
@ user581544:私の指摘は、抽象クラス*はどちらかまたは両方を様々な程度に表すことができるということです。 –
これは非常に異なる概念です。
抽象化はブラックボックスの概念に似ています。入力が入り、ブラックボックスが何かをし、出力が出ます。ブラックボックスで何が起こるかは関係ありません。あなたが知っておかなければならないのは、それが機能することだけです。実際の人生の例はjavaのハッシュ関数です。ユーザーが知っておかなければならないことは、入力値をハッシュすることです。ユーザーがハッシュ値を取得する方法はユーザーには関係ありません。ブラックボックスは抽象です。要点は、それがどのように機能するかを知る必要はないということです。
概要クラス(少なくともJavaでは)は、インターフェイスと完全なOOPクラスの混合物です。インタフェースは、拡張するクラスに必要なメソッドを定義します。コード内では、インタフェースを適切に実装し、すべてが期待どおりに動作することを保証します。抽象クラスにはこれらの空のメソッド(契約)があり、呼び出すことのできるメソッドも完全に実装されています。
http://www.javacoffeebreak.com/faq/faq0084.html。 –
@ crowso-あなたはまだ答えに満足していませんか?回答の1つを受け入れてください –