データ融合JAVAアプリケーション開発者企業招聘連絡研修7日目課程総括


09抽象クラス


09-1抽象クラス


抽象クラスとは?


抽象クラスはabstract classと呼ばれ、これまでに創造されたクラスはconcrete classである.
抽象クラスの場合、抽象メソッドは常に抽象メソッドを含み、抽象メソッドには実装コードがありません.
abstract int add(int x, int y);
抽象方法は抽象定語を用い、関数実現部はない.で終了します.

メソッド宣言の意味

int add(int num1, int num2);
上記のコードは、2つの整数を受け入れて1つの値を返すことを意味することがわかります.
定義함수 반환값,함수 이름,매개변수は関数に対する役割と実装解の定義であるため,実装関数体は宣言子を記述するよりも重要であることがわかる.

抽象クラスの実装


2つの抽象的な方法があります.display()typing()メソッドを実装するturnOn()クラス、およびそれを継承するturnOff()クラス.
そのうちComputer万の抽象クラスDesktopdisplay()クラスを継承していますLaptopを実現.
Computer.java
package abstractex;

public abstract class Computer {
	public abstract void display();
	public abstract void typing();
	public void turnOn() {
		System.out.println("전원을 켠다.");
	}
	public void turnOff() {
		System.out.println("전원을 끈다.");
	}
}
Desktop.java
package abstractex;

public class Desktop extends Computer {
	
	@Override
	public void display() {
		System.out.println("desktop display()");
	}
	
	@Override
	public void typing() {
		System.out.println("desktop typing()");
	}
}
Laptop.java
package abstractex;

public abstract class Laptop extends Computer {	
	@Override
	public void display() {
		System.out.println("laptop display()");
	}
}
MyLaptop.java
package abstractex;

public class MyLaptop extends Laptop {
	@Override
	public void typing() {
		System.out.println("mylaptop typing");
	}
}
LaptopおよびMyLaptopはすべてのクラスで共通であるが、turnOn()およびturnOff()の実装はサブクラスに依存する.
このように、各サブクラスの異なる実装方法は抽象的な方法として宣言される.display()クラスは、すべての方法を実施する.typing()クラスでは、すべてのメソッドが実装されていないため、抽象クラスであるべきである.Computerクラスはすべての抽象メソッドを実現しているので、抽象クラスではありません.

自分でコードします


概念をさらに理解するために、試してみましょう.
Car.java
package vehicle;

public abstract class Car {
	public abstract void refuel();
	public abstract void run();
	
	public void stop() {
		System.out.println("차가 멈춥니다.");
	}
}
Bus.java
package vehicle;

public class Bus extends Car {

	@Override
	public void run() {
		System.out.println("버스가 달립니다.");
	}
	
	@Override
	public void refuel() {
		System.out.println("천연 가스를 충전합니다.");
	}
	
	public void takePassenger() {
		System.out.println("승객을 버스에 태웁니다.");
	}
}
AutoCar.java
package vehicle;

public class AutoCar extends Car{

	@Override
	public void refuel() {
		System.out.println("휘발유를 주유합니다.");
	}

	@Override
	public void run() {
		System.out.println("차가 달립니다.");
	}
	
	public void load() {
		System.out.println("짐을 싣습니다.");
	}
}
CarTest.java
package vehicle;

public class CarTest {

	public static void main(String[] args) {
		Bus bus = new Bus();
		AutoCar autoCar = new AutoCar();
		
		bus.run();
		autoCar.run();
		
		bus.refuel();
		autoCar.refuel();
		
		bus.takePassenger();
		autoCar.load();
		
		bus.stop();
		autoCar.stop();
	}

}
LaptopMyLaptopはそれぞれ抽象クラスとして継承されるクラスを残して再定義し、refuel()は汎用メソッドとして宣言する.run()クラスにおいて、stop()と呼ばれる方法がある.Busクラスには、takePassenger()という方法があります.

抽象クラスを作成する理由


抽象クラスをどこで使用するかを理解するために、さっき作成したAutoCarクラスとテストサブクラスのload()クラスを作成し、実践します.
ComputerTest.java
package abstractex;

public class ComputerTest {

	public static void main(String[] args) {
		Computer c1 = new Computer();
		Computer c2 = new Desktop();
		Computer c3 = new Laptop();
		Computer c4 = new MyLaptop();
	}

}
試してみると、c 1、c 3は生成できません.ComputerクラスとComputerTestクラスは抽象クラスだからです.
各クラスには実装されていないコードがあるため、インスタンスを作成できません.

抽象クラスで実装する方法


抽象クラスで実装/非実装の方法をどのように区別しますか?ComputerまたはLaptopであればサブクラスで共有できるが、turnOn()またはturnOff()などは因子クラスによって異なる可能性があるため、実施しない(LaptopかDesktopか).

09-2テンプレートメソッド


抽象クラスとテンプレートメソッド


抽象クラスを使用する例にはテンプレートメソッドがあります.
テンプレートメソッドは抽象クラスを使用して実装できます.
package template;

public abstract class Car {
	public abstract void drive();
	public abstract void stop();
	
	public void startCar() {
		System.out.println("시동을 겁니다.");
	}
	
	public void turnOff() {
		System.out.println("시동을 끕니다.");
	}
	
	final public void run() {
		startCar();
		drive();
		stop();
		turnOff();
	}
}
上記のdisplay()メソッドはテンプレートメソッドであり、typing()クラスを継承するすべてのサブクラスがこの順序で動作します.
継承するクラスrun()Carの2つをそれぞれ実装しましょう.
AICar.java
package template;

public class AICar extends Car{
	@Override
	public void drive() {
		System.out.println("자율 주행을 한다.");
		System.out.println("자동차가 스스로 방향 전환을 한다.");
	}
	
	@Override
	public void stop() {
		System.out.println("스스로 멈춘다.");
	}
}
ManualCar.java
package template;

public class ManualCar extends Car {
	@Override
	public void drive() {
		System.out.println("사람이 운전한다.");
		System.out.println("사람이 핸들을 조작한다.");
	}
	
	@Override
	public void stop() {
		System.out.println("브레이크로 정지한다.");
	}
}
CarTest.java
package template;

public class CarTest {

	public static void main(String[] args) {
		System.out.println("===자율주행 자동차===");
		Car myCar = new AICar();
		myCar.run();
		
		System.out.println("===사람이 운전하는 자동차===");
		Car hisCar = new ManualCar();
		hisCar.run();
	}

}
出力:
===自主走行車==
起動します.
自主走行を行う.
車は自分で転向する.
自動停止
起動を閉じます.
===人が運転する車==
起動します.
誰かが運転しています.
人がハンドルを操作する.
ブレーキが止まる.
起動を閉じます.

テンプレートメソッドの役割


したがって、テンプレート方法の役割は、AICarを定義することである.
ここでは少し紛らわしいので、同じ概念の他の実装を探して、final予約語を使う場合もあれば、final予約語を使う場合もあります.まず本の中の記述によると,シナリオの定義であるためfinal予約語を用いて再定義することはできない.

09-3テンプレートメソッドの適用


テンプレートの方法を理解するための例を作成します.ManualCarというクラスが生成され、메서드의 실행 순서와 시나리오が有するレベルに従って実現可能な3つのPlayerPlayer、およびrun()の機能を有する.jump()のすべてのレベルで利用可能なturn()の方法が提供される.
この方法は、1回のPlayergo(int count)と同様に、run、1回のcountである.
このレベルでは不可能な動作であれば、出力は不可能です.

クラス機能と関係


UMLを使用してクラス図を描き、プログラミングを行うことが望ましい.jumpは、クラス内の場合、turnに従って異なる機能を提供する.
if (level == beginner) {
	...
} else if (level == advanced) {
	...
} else if (...) {
	...
}
このように実装される場合、機能を追加したり、レベルを追加したりする場合は、コードを増やし続ける必要があります.

デザインクラス

Playerクラスと레벨クラスは、(HAS−A)関係を含む.
すべてのPlayerには独自のレベルがあり、異なるレベルの機能が異なるため、PlayerLevelクラスを抽象クラスとして作成し、すべてのレベルで可能な汎用機能と各レベルで異なる機能を抽象クラスとして実現します.
コードが長くなってgistに分離
https://gist.github.com/crisine/517d1cfcfb8d09a5d856fba318317d02 PlayerランクのPlayerLevelの方法はちょっとわかりませんが、元のゲームならEXPか特定の条件を満たしてからアップグレードするのですが、ここでは代入としてランクを「変更」する方法です.正しいようです.Playerは、最初はupgradeLevel(PlayerLevel level)と定められた.ジェネレータではplayerレベルで開始します.
次に、BeginnerBeginnerクラスのインスタンスをそれぞれ宣言し、AdvancedLevelインスタンスのSuperLevelメソッドを呼び出し、作成したばかりのインスタンスをパラメータとしてアップグレード(置換)します.

抽象クラスと多形性

playerが所有できる各種upgradeLevelは、単独の資料型宣言はなく、ここではPlayerと宣言されている.クラス変更方法のパラメータもPlayerLevelであり、複数のクラスが存在してもPlayerLevelクラスに代入することができる.

09-4最終予約語

PlayerLevel予約語は、PlayerLevelfinal변수等に用いることができる.
変数の使用へんすうのしよう:定数
使用方法:サブクラスで再定義できません
≪クラスに使用|Use Class|ldap≫:≪継承不可|Inheritable|ldap≫

複数のファイル共有定数(例)

public class Define {
	public static final int MIN = 1;
    public static final int MAX = 100;
    public static final double PI = 3.141592;
}

...

main method() {
	sysout(Define.PI);
}
変数を静的に宣言した後に定量化するため、インスタンスを作成する必要はありません.