[JAVA] Polymorphismus

grundlegende Denkweise

Verwenden Sie das Konzept der Vererbung "is-a", um den Umriss der Instanz programmgesteuert zu erkennen. Zum Beispiel ein Verfahren zum programmgesteuerten Erkennen einer aus der "Track" -Klasse erzeugten "Track" -Instanz als Instanz der "Automobile" -Klasse.

Programmgesteuertes Erkennen des Umrisses einer Instanz

Bei PKW und LKW ...

Car car =new Truck

①new Truck Erstellen Sie eine Instanz.

②Car car Was ist für Sie die erstellte Instanz? Dieses Mal wurde die Instanz aus der "Streckenklasse" erstellt, dies bedeutet jedoch, dass sie als "Auto" betrachtet wird.

Bild

スクリーンショット 2018-03-04 11.14.42.png

スクリーンショット 2018-03-04 11.14.52.png

Weisen Sie die aus der untergeordneten Klasse generierte Instanz der übergeordneten Klasse zu

Denkweise

Wenn Sie eine aus einer untergeordneten Klasse erstellte Instanz einer übergeordneten Klasse zuweisen, können die Mitglieder der untergeordneten Klasse nicht verwendet werden.

Bild

多様性(親インスタンスへの代入).png

Was passiert, wenn die übergeordneten und untergeordneten Klassen Methoden mit demselben Namen haben?

Denkweise

Aufgrund des Vererbungskonzepts wird die Methode der untergeordneten Klasse auch aufgerufen, wenn die Methode der übergeordneten Klasse aufgerufen wird.

Bild

スクリーンショット 2018-03-02 11.45.17.png

-Die obige Abbildung hat zwei Typen: "Assistenteninstanz", die als "Assistent" angesehen wird, und "Assistenteninstanz", die als "Zeichen" betrachtet wird. -Jede Methode run wird aufgerufen, aber wenn die Methode run in der Wizard-Instanz aufgerufen wird, die als Character angesehen wird, frage ich mich, ob die Methode der Character-Klasse aufgerufen wird ...

Wenn Sie den Umriss der Instanz von der übergeordneten Klasse in die untergeordnete Klasse ändern möchten

Denkweise

Ersetzen Sie durch das obige Beispiel die Methode, wenn Sie die "Assistenten" -Instanz, die als "Zeichen" betrachtet wird, in die "Assistenten" -Instanz ändern möchten, die als "Assistent" betrachtet wird.

Änderungsmethode

** Normal denken ... **

Wizard wizard2 = character;

Es sieht gut aus, aber ich bekomme einen Fehler damit ... Der Grund ist, dass die "Assistenten" -Instanz als "Zeichen" betrachtet wird und die "Assistenten" -Instanz grob als "Zeichen" angesehen wurde. Aus der Sicht des Computers: "Ist das wirklich ein" Zauberer "? Es gibt andere" Charaktere ", richtig?"

aus diesem Grund

Wizard wizard2 = (Wizard)character;

Sie müssen den Cast-Operator verwenden, um die Änderung der Klasse zu erzwingen. Oben wird es zwangsweise in eine Variable vom Typ (Assistent) geändert.

Jedoch

Character character = new Hero;//Stellen Sie sich den Helden als Charakter vor!
Wizard wizard2 = (Wizard)character;//Stellen Sie sich den Helden als Hexe vor! (??)

Die oben genannten Fehler können auftreten. -Erstelle eine Heldeninstanz, die zuerst als Charakter erfasst wird. -Erstelle eine Heldeninstanz, die als Hexe angesehen werden kann. In diesem Fall gilt ** Is-a-Beziehung nicht **, sodass Sie den Fehler ClassCastException erhalten (erzwungene Änderung durch Umwandlung ist falsch). ・ ○ Held ist ein Charakter. ・ × Held ist eine Hexe.

Mit anderen Worten, die einzigen Klassen, die durch Casting zwangsweise geändert werden können, sind die Klasse, die beim Erstellen der Instanz verwendet wurde, oder die Klasse nach ihrer untergeordneten Klasse **.

So stellen Sie fest, ob die erzwungene Änderung durch Besetzung korrekt ist

Methode

Um festzustellen, ob die erzwungene Konvertierung durch Umwandlung korrekt ist, verwendet Java den Operator "instanceof". Der Operator "instanceof" bestimmt, ob eine Inkonsistenz vorliegt, auch wenn er dem vom Operator "cast" angegebenen Typ zugewiesen ist.

Beispiel

if(character instanceof Wizard){//wenn,`character`Zu`Wizard`Wenn Sie es als betrachten können
 Wizard wizard2 = (Wizard)character;
}

Vorteile der Vielfalt

Sie können die Verarbeitung zusammenstellen

Denkweise

Durch die Verwendung eines Arrays für Klassenvariablen beim Erstellen einer Instanz ist es möglich, eine Stapelverarbeitung für die Instanz durchzuführen.

** Wenn Sie kein Array verwenden ** Wenn Sie Hero1``Hero2``Hero3 aus der Heldenklasse und Wizard1``Wizard2``Wizard3 aus der Hexenklasse generieren und alle angreifen lassen möchten

//Instanzgenerierung
Hero hero1 = new Hero();
Hero hero2 = new Hero();
Hero hero3 = new Hero();
Wizard wizard1 = new Wizard();
Wizard wizard2 = new Wizard();
Wizard wizard3 = new Wizard();

//Methodenaufruf
hero1.attack();
hero2.attack();
hero3.attack();
wizard1.attack();
wizard1.attack();
wizard1.attack();

In diesem Fall wird der Methodenaufruf auf die gleiche Weise wiederholt und ist nicht gut genug ...

** Verwenden eines Arrays **

//Array erstellen
Character[] character = new Character[6];

//Instanzgenerierung
Character character[0] = new Hero;
Character character[1] = new Hero;
Character character[2] = new Hero;
Character character[3] = new Wizard;
Character character[4] = new Wizard;
Character character[5] = new Wizard;

//Methodenaufruf
for(Character ch : character){
 ch.attack();
}

Der Prozess der Methode ist ordentlich organisiert und es fühlt sich gut an!

Kann grobe Argumente erhalten

Beispiel

** Wenn du ein Monster angreifen willst **

	public static void main(String[] args) {
		//Array-Variablen erstellen
		Monster[] monster = new Monster[4];
		//Generieren einer Monsterinstanz
		monster[0] = new Slime();
		monster[1] = new Slime();
		monster[2] = new Goblin();
		monster[3] = new Goblin();
		//Eine Heldeninstanz generieren
		Hero hero = new Hero();
		//Greife Monster an
		hero.attack(monster[0]);
	}

public class Hero {
	void attack(Monster monster) {
		monster.hp-=10;
	}
}

Auf diese Weise ist es nicht erforderlich, das Argument der "Angriffsmethode" der "Helden" -Klasse für jeden Monstertyp vorzubereiten.

Es ist möglich, die Verarbeitung verschiedener Verarbeitungsergebnisse zu kombinieren

Denkweise

Selbst wenn Sie eine Methode mit dem Klassennamen der übergeordneten Klasse aufrufen, wird die Methode der untergeordneten Klasse aufgerufen, sodass Sie die Methodenaufrufe kombinieren können.

Beispiel

Schleimklasse

public class Slime extends Monster {
	public void run() {
		System.out.println("Der Schleim schwoll an und rannte weg!");
	}
}

Goblin-Klasse

public class Goblin extends Monster{
	public void run() {
		System.out.println("Der Kobold lief Slapstick weg!");
	}
}

Monsterklasse


public abstract class Monster {
	String name;
	int hp = 50;
	public abstract void run();
}

Hauptmethode

//Generieren einer Monsterinstanz
monster[0] = new Slime();
monster[1] = new Goblin();
//
for(Monster mo:monster) {
mo.run();



Recommended Posts

Polymorphismus
Polymorphismus
[Java] Polymorphismus
Über Polymorphismus
Verkapselung, Polymorphismus
Java (Verdienste des Polymorphismus)