abstract classとinterfaceはどんな違いがありますか?それぞれいつ使いますか?

1755 ワード

まず抽象類とインタフェースの概念と役割を復習する.
メソッドのみを宣言して実装しないクラスを抽象クラスと呼ぶ.
オブジェクト向けの概念では、すべてのオブジェクトがクラスによって描かれていることを知っていますが、逆にそうではありません.すべてのクラスがオブジェクトを描くために使用されるわけではありません.特定のオブジェクトを描くのに十分な情報がクラスに含まれていない場合、このようなクラスは抽象クラスです.
例えば、グラフィック編集ソフトウェアの開発を行うと、問題分野には円、三角形という具体的な概念が存在し、それらは異なるが、形状という概念に属しており、形状という概念は問題分野には存在せず、抽象的な概念であることがわかります.抽象的な概念は問題領域に対応する具体的な概念がないからこそ,抽象的な概念を特徴付ける抽象クラスは実例化できない.
インタフェースといえば、インタフェースは抽象クラスの変体です.インタフェースのすべての方法は抽象的で,プログラム体は1つもない.インタフェースはstatic finalメンバー変数のみを定義できます.インタフェースの実装は、インタフェース定義から動作を継承できない以外は、サブクラスと同様です.さらに、instanceof演算子は、あるオブジェクトのクラスがインタフェースを実装しているかどうかを判断するために使用することができる.
まだぼんやりしてるでしょ?では、もう2つのプログラムの例を挙げて、ゆっくりと体得することができます.
まず、インタフェース・プログラムの例です.
public interface iFoo1{
		// a+b 
		int doPlus(int a, int b);
	}

	public interface iFoo2{
		// a-b 
		int doMinus(int a, int b);
	}

	public Impl implements iFoo1,iFoo2{
		public int doPlus(int a, int b){
			return a+b;
		}
		public int doMinus(int a, int b){
			return a-b;
		}
		.....
	}

抽象クラスインスタンス.抽象クラスでは、1つのサブクラスが1つの親しか継承できないことに注意してください.
public abstract class absFoo{
		public void doCommon(){
			.......
		}
		public abstract int doSomething();
	}

	public class Foo extends absFoo{
		public int doSomething(){
			int res=0;
			....
			return res;
		}
	}

今のところインタフェースを使うのは少し多いです.
プログラムの一部のコンポーネントは、頻繁に交換する必要がある場合は、インタフェースを柔軟に運用し、インタフェースの実装方法に具体的な方法を書くことができ、インタフェースの方法がどのように呼び出され、どのように来たのかに関心を持つ必要はありません.
これは,オブジェクト向け設計における低結合概念を実証している.
ハ、「高凝集、低結合」を補足
簡単に言えば、高集約はモジュール内部の関連度を高めることであり、低結合はモジュール間の関連度を低減することである.