黒馬プログラマー---java抽象/インタフェース向けプログラミング

2145 ワード

------Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング、お客様とのコミュニケーションを期待しています!------
抽象プログラミング向け:重要なクラスを設計する際に、そのクラスを具体的なクラスに向かわせず、抽象クラスに向かわせることを指す.すなわち、設計において重要なデータは、特定のクラス宣言のオブジェクトではなく抽象クラス宣言のオブジェクトである.
ポイント:
1.abstractクラスの使用:abstractクラスは操作のみに関心を持ち、これらの操作の具体的な実現の詳細に関心を持たない.
2.マルチステート:マルチステートを使用してプログラム設計を行い、核心技術の一つはアップモデルチェンジ対象を使用することである.abstractクラスが宣言するオブジェクトは、そのサブクラスのアップコンバートオブジェクトとして、このアップコンバートオブジェクトを使用してサブクラスの書き換え方法を呼び出すことができます.
インタフェース向けプログラミング:オブジェクト向けプログラミングに似ていますが、抽象クラスをインタフェースに変えただけです.
抽象クラスとインタフェースの違い:
同じ:抽象的な方法があります.
異:インタフェースには定数しかなく、インタフェースにはabstractメソッドしかありません.抽象クラスによっては、変数があり、具体的な方法があります.
ポイント:
1.インタフェースの使用:サブクラスが特定のメソッドを実装する以外に、いくつかのメンバーを継承する場合は、抽象クラスを使用し、単純にメソッドを実装する必要がある場合は、インタフェースの使用を考慮することができます.
2.インタフェースコールバック:実際には抽象クラスのモデルチェンジ対象の使い方と同様であり,言うまでもない.
例:
ここには円類があり、面積を求める方法が含まれています.
public class Circle{
	double r;
	Circle(double r){
		this.r =r;
	}
	public double getArea(){
		return (3.14*r*r);
	}
}
円柱の体積を求める柱クラスがあります
class Pillar{
	Circle bottom;
	double height;
	Pillar(Circle bottom,double height){
		this.botton = bottom;
		this.height = height;
	}
	public double getVolume(){
		return bottom.getArea()*height;
	}
}

このプログラムが円柱の体積を求めるのに何の問題もないことが分かったが,後で拡張して直方体の体積を求めるために用いたり,地面が他の図形の柱であることを求めるために用いたりするには,プログラムを書き換えざるを得なかった.
この場合,抽象向けまたはインタフェース向けでプログラミングすることができる.
抽象クラスまたはインタフェースを新規作成します.
abstract class Geometry{
	public abstract double getArea();
}

interface Geometry{
	public abstract double getArea();
}

この問題はabstractクラスを使用してもインタフェースを使用しても適用されます.
それからPillarクラスを少し書き直します
class Pillar{
	Geometry bottom;
	double height;
	Pillar(Geometry bottom,double height){
		this.botton = bottom;
		this.height = height;
	}
	public double getVolume(){
		return bottom.getArea()*height;
	}
}
は、次いで、Geometryクラスを継承するか、またはGeometryインタフェースを実装し、Pillarクラスにオブジェクトを転送するだけでよい.アップコンバートオブジェクトの使用もインタフェースコールバックも、ここでは同じです.
開閉原則:拡張に対して開放し、修正に対して閉鎖する.
上記の例では、Geometryクラスを継承し、無数のサブクラスを使用することができます.これが拡張に開放されています.
しかしPillarクラスはコアであり,これ以上修正されるべきではないので,修正を閉じるべきである.