Java多態は結局どんな利益がありますか?

6094 ワード

多形とは何か、つまり親の継承方法の場合、その継承方法は自分なりに定義し直します。
1.向上への転換。
前に継承して言及したことがあります。親の参照は、サブオブジェクトを指します。この場合の引用はサブクラスの上書き書き換えの方法しか呼び出しられません。サブクラス特有の方法を呼び出すことはできません。自動変換

public class Main {
	public static void main(String[]args) {
		Father f = new Son();
		f.money();
		
		
	}
}	
class Father{
	void money() {
		System.out.println("    ");
	}
}
class Son extends Father{
	void money() {
		System.out.println("    ");
	}
	void SonPlay() {
		System.out.println("        ?");
	}
}
実行結果:

もし私がこの引用区でサブタイプ特有の方法を呼び出すなら(上書き書き換えではない)?エラーが発生します。

次の例をあげます
異なる言語の出力「ハローワールド」
(1)親類は正常類

public class Language{ //     
	void HelloWorld() { //  HelloWorld
		
	}
}

public class CLanguage extends Language{ //C          
	void HelloWorld() { //  HelloWorld
		System.out.println("printf(\"HelloWorld!\");");
	}
}

public class JavaLanguage extends Language{ //Java       
	void HelloWorld(){
		System.out.println("System.out.println(\"HelloWorld!\")");
	}
}
関数コールを提供します。

public class Test {
	public static void main(String[]args) {
		
		//inputHelloWorld(new CLanguage());
		//inputHelloWorld(new JavaLanguage());
		//  
		Language language;
		
		language = new CLanguage();
		inputHelloWorld(language);
		language = new JavaLanguage();
		inputHelloWorld(language);
		
		
	}
	public static void inputHelloWorld(Language language) {
		language.HelloWorld();
	}
}
関数を変更しない形参(親)では、実参(サブクラス)の変更はプログラムにエラーが発生しません。つまり、私が関心を持っているのは関数の形参だけです。Language類に関連するクラス(自分またはサブオブジェクト)であればいいです。
実行結果:

もし父がインターフェースや抽象類だったら?いいです
(2)親類をインターフェースとする
父が本当にある基準を提供するために、あるいは父がコンテンツを実現する必要がない場合などは、考慮してもいいでしょう。父がインターフェースになり、インターフェースも多状態をサポートします。

public class Test {
	public static void main(String[]args) {
 
		//inputHelloWorld(new CLanguage());
		//inputHelloWorld(new JavaLanguage());
		//  
		Language language;
		
		language = new CLanguage();
		inputHelloWorld(language);
		language = new JavaLanguage();
		inputHelloWorld(language);
		
		
	}
	public static void inputHelloWorld(Language language) {
		language.HelloWorld();
	}
}
 
interface  Language{ //     
	public void HelloWorld() ; //  HelloWorld
		
	
}
class CLanguage implements Language{ //C          
	public  void HelloWorld() { //  HelloWorld
		System.out.println("printf(\"HelloWorld!\");");
	}
}
class JavaLanguage implements Language{
	public  void HelloWorld(){
		System.out.println("System.out.println(\"HelloWorld!\")");
	}
}
実行結果:

もちろん、抽象類は親類としても多形が可能ですよ。
2.下への転換。
親の引用をサブクラスのオブジェクトに向けた引用を強く異なるサブクラスのオブジェクトに変換します。ターンした後のオブジェクトは、サブ固有のメソッドを呼び出すことができます。
(上記のようなサブクラスの呼び出し特有の方法を解決するとエラーが発生します)

public class Main {
	public static void main(String[]args) {
		Father f = new Son();
		//f.money();
		Son s = (Son)f;
		s.SonPlay();
		
	}
}	
class Father{
	void money() {
		System.out.println("    ");
	}
}
class Son extends Father{
	void money() {
		System.out.println("    ");
	}
	void SonPlay() {
		System.out.println("        ?");
	}
}
実行結果:

上記のプログラミング言語出力ハローワールドの例を挙げて、inputLanguage方法を要求したら、導入された参加者の中のサブオブジェクトについて判断します。もし入ってきた相手がC言語であれば、新規の特有の方法を出力します。Java類も同じです。
ここはちょっとシンプルな工场モードみたいです。ここは何ですか?

public class CLanguage implements Language{ //C          
	public  void HelloWorld() { //  HelloWorld
		System.out.println("printf(\"HelloWorld!\");");
	}
	public void CReadMe() { //  C        
		System.out.println("  C  ");
		
	}
}

public class JavaLanguage implements Language{
	public  void HelloWorld(){
		System.out.println("System.out.println(\"HelloWorld!\")");
	}
	public void JavaReadMe() {//  Java      
		System.out.println("  Java");
	}
}
input Hello World関数を変更します。

public class Test {
	public static void main(String[]args) {
 
		//inputHelloWorld(new CLanguage());
		//inputHelloWorld(new JavaLanguage());
		//  
		Language language;
		
		language = new CLanguage();
		inputHelloWorld(language);
		language = new JavaLanguage();
		inputHelloWorld(language);
		
	}
	public static void inputHelloWorld(Language language) {
		
		if(language instanceof CLanguage) { 
			CLanguage clanguage = (CLanguage) language;
			clanguage.CReadMe();
		}else if(language instanceof JavaLanguage) {
			JavaLanguage javalanguage = (JavaLanguage)language;
			javalanguage.JavaReadMe();
		}
        language.HelloWorld();
	}
}
実行結果:

総じて言えば、多形は、関数をその親の形参に不変にすることができ、実際の参は複数の異なるサブオブジェクトに入ることができる。