面向對象——多態的理解

前言

剛剛有個憨批學妹跑來問我多態的低耦合性是怎麼體現的。於是我也複習了一下,整理如下。

多態

多態是指,子類可以替換父類,在實際的代碼運行過程中,調用子類的方法實現。

接下來,我們先來看如何利用接口類來實現多態特性。

public interface Iterator {
  String hasNext();
  String next();
  String remove();
}

public class Array implements Iterator {
  private String[] data;
  
  public String hasNext() { ... }
  public String next() { ... }
  public String remove() { ... }
  //...省略其他方法...
}

public class LinkedList implements Iterator {
  private LinkedListNode head;
  
  public String hasNext() { ... }
  public String next() { ... }
  public String remove() { ... }
  //...省略其他方法... 
}

public class Demo {
  private static void print(Iterator iterator) {
    while (iterator.hasNext()) {
      System.out.println(iterator.next());
    }
  }
  
  public static void main(String[] args) {
    Iterator arrayIterator = new Array();
    print(arrayIterator);
    
    Iterator linkedListIterator = new LinkedList();
    print(linkedListIterator);
  }
}

在這段代碼中,Iterator 是一個接口類,定義了一個可以遍歷集合數據的迭代器。Array 和 LinkedList 都實現了接口類 Iterator。我們通過傳遞不同類型的實現類(Array、LinkedList)到 print(Iterator iterator) 函數中,支持動態的調用不同的 next()、hasNext() 實現。
具體點講就是,當我們往 print(Iterator iterator) 函數傳遞 Array 類型的對象的時候,print(Iterator iterator) 函數就會調用 Array 的 next()、hasNext() 的實現邏輯;當我們往 print(Iterator iterator) 函數傳遞 LinkedList 類型的對象的時候,print(Iterator iterator) 函數就會調用 LinkedList 的 next()、hasNext() 的實現邏輯。

多態的意義

多態特性能提高代碼的可擴展性和複用性。爲什麼這麼說呢?我們回過頭去看看剛剛舉的實例)。在那個例子中,我們利用多態的特性,僅用一個 print() 函數就可以實現遍歷打印不同類型(Array、LinkedList)集合的數據。當再增加一種要遍歷打印的類型的時候,比如 HashMap,我們只需讓 HashMap 實現 Iterator 接口,重新實現自己的 hasNext()、next() 等方法就可以了,完全不需要改動 print() 函數的代碼。所以說,多態提高了代碼的可擴展性。如果我們不使用多態特性,我們就無法將不同的集合類型(Array、LinkedList)傳遞給相同的函數(print(Iterator iterator) 函數)。我們需要針對每種要遍歷打印的集合,分別實現不同的 print() 函數,比如針對 Array,我們要實現 print(Array array) 函數,針對 LinkedList,我們要實現 print(LinkedList linkedList) 函數。而利用多態特性,我們只需要實現一個 print() 函數的打印邏輯,就能應對各種集合數據的打印操作,這顯然提高了代碼的複用性。

這也就利用的多態的特性去實現了低耦合,比如我們新加一個功能,我們不會去改之前的代碼,刪一個功能不用動之前的代碼
希望各位大佬指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章