Think in java(三)抽象クラス,インタフェースの再論

1773 ワード

前に抽象クラスとインタフェースを紹介しましたが、今日はもっと深く
Java言語プログラム設計-基礎編(十)抽象類、インタフェースと包装類
1.抽象クラス
抽象メソッドを含むクラスを抽象クラスと呼び、抽象クラスはオブジェクトを作成できません.抽象クラスのサブクラスがオブジェクトをインスタンス化する場合は、抽象親クラス内のすべてのメソッドの定義を実現する必要があります.抽象クラスと抽象メソッドを作成すると、クラスの抽象を明確にすることができます.
2.インタフェース
構造では、作成者がメソッド名、パラメータリスト、および戻りタイプを決定できますが、メソッドボディはありません.クラスが複数のインタフェースを継承し、マルチインパルス継承のような機能を実現できます.インタフェースにはドメインも含まれますが、いずれも暗黙的なfinalとstaticです.インタフェースはインタフェースを継承することもできます.1つのクラスは1つのクラスしか継承できませんが、複数のインタフェースを継承することができます.
3.完全なデカップリング
インタフェースはクラスに対して結合性を低下させ,コードの多重化を増大させる.
4.インタフェースのアップグレード
1つのクラスは、複数のインタフェースを継承し、各インタフェースが独立したタイプである各インタフェースにアップグレードできます.インタフェースのアップグレードの例を見てみましょう
package test;

interface CanFly{
	void fly();
}

interface CanFight{
	void fight();
}

interface CanSwim{
	void swim();
}

class Action{
	public void fight(){
		System.out.println("Action fight");
	};
}

class Hero extends Action implements CanFight,CanSwim,CanFly{

	@Override
	public void swim(){
		System.out.println("swim");
	};
	public void fly(){
		System.out.println("fly");
	};
	
}

public class Interface{
	public static void t(CanFly x){x.fly();}
	public static void u(CanSwim x){x.swim();}
	public static void v(CanFight x){x.fight();}
	public static void x(Action x){x.fight();}
	public static void main(String[] args){
		Hero h = new Hero();
		t(h);
		u(h);
		v(h);
		x(h);
	}
	

}

実行結果
fly
swim
Action fight
Action fight

Heroは複数のインタフェースを組み合わせており,主クラスでは4つの方法を用いて上記のインタフェースをパラメータとして伝達することは,各インタフェースにアップグレードできることを意味し,インタフェースを使用する核心的な原因であり,もう1つの原因はクライアントプログラマがこのクラスのインタフェースのオブジェクトを作成することを防止し,これが1つのインタフェースであることを確保することである.
5.インタフェースのドメイン
インタフェースのドメインはstatic,finalであり,以前のバージョンでは定数を配置するためによく用いられていたが,今では列挙クラスで置き換えられ,より柔軟で便利になった.