iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0

介紹

前言

昨天的最後提到了Java其實可以讓子類別繼承多個「介面」父類別的成員。

如果反過來,讓一個父類別被多個子類別繼承呢 ?

這個就稱為「多型」(Polymorphism)。

多型顧名思義就是很多類型,指為不同資料類別提供統一的介面。

透過繼承過來的函數屬性,多型使用此去完成不同的功能。
https://ithelp.ithome.com.tw/upload/images/20221012/20151216U4D2wBuEB0.png
(多型示意圖)


多型簡單範例

class Grade {
  void grade_show() {
    System.out.println("Here comes Student's grades : ");
  }
}

class S1 extends Grade {
  void grade_show() {
    System.out.println("Student 1 got : 98 ");
  }
}

class S2 extends Grade {
  void grade_show() {
    System.out.println("Student 2 got : 87 ");
  }
}

public class Main {
  public static void main(String[] args) {
    Grade main_obj = new Grade();

    Grade S1_obj = new S1();   //將S1當Grade來看
    S2 S2_obj = new S2();    //S2用自己物件名稱和自己的建構子初始化內容
    
	main_obj.grade_show();
	S1_obj.grade_show();
	S2_obj.grade_show(); 
  }
}

S1,S2繼承Grade類別成員,在主函數中宣告物件時,因為兩個子類別都繼承了父類別的屬性,我們這邊將兩者物件都當Grade來看,並用各自之建構子去初始化內容。

介紹到這邊,為甚麼要用多型讓多個子類別去繼承呢 ? 這樣的寫法 :

讓物件與類別邏輯上獨立,增加了程式可維護性(maintainability)與可重覆使用性(reusability)


抽象多型

接著提到抽象類別的多型,因為本身不能建立物件,繼承上稍微有點不同

abstract class Animal{
    public abstract String identify();
}

class mammals extend Animal {
		public abstract String identify(){
			return 'Its mammals';
		}
}

class Amphibians extend Animal {
	  public abstract String identify(){
			return 'Its Amphibians';
		}
}

public class Main{

		public String identification(Animal animal){
			if(animal.identify() == 'Its mammals'){
                return 'Mammals';
                    }else if(animal.identify() == 'Its Amphibians'){
                        return 'Amphibians';
                            }else{
                                return 'Nothing';
                            }
		 }

		public static void main(String[] args){
			Amphibians Frogs = new Amphibians();
			System.out.println(identification(Frogs));  //Outputs :  Amphibians       
		}
}

程式解析 :
這支程式是設計來辨識動物是哺乳、兩棲還是都不是。

  • 因為抽象類別不能創物件,所以這邊利用多型觀念讓兩個子類別繼承其成員。
    • 再在子類別中進行覆寫(override)

此部分還可以注意的是主程式的部分

  • 函數identification()是用來分辨動物種類
    • 宣告參數使用抽象的Animal,所以我們只需把繼承的物件建構子當傳入引數判斷即可

抽象或介面多型,可以將不同的概念繼承在同一個通用的類別上

(分辨動物種類之函式碼參考什麼是oo-物件導向與多型去做改寫)


以上內容若有誤或任何問題,煩請不吝嗇告知,謝謝您!!!/images/emoticon/emoticon12.gif


上一篇
Day 26 : 介面
下一篇
Day 28 : 內部類別 - Inner class
系列文
30天Java由淺入深30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言