対象に向けて——多形的な理解

7864 ワード

前言
ちょうど1人の愚直な後輩が走ってきて、私の多状態の低結合性はどのように体現していますか?そこで私も復習して、次のように整理しました。
多形
多形とは、親のクラスをサブクラスに置き換えることができ、実際のコードの実行中に、サブクラスを呼び出す方法が実現されることです。
次に,インターフェースクラスを利用して多状態特性を実現する方法を先に見た。
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はインターフェースクラスであり、集合データを巡回することができるローズマリーを定義しています。ArayとLinkdListはインターフェースタイプIteratorを実現しました。私たちは、異なるタイプの実装クラス(Aray、LinkdList)からprint(Iterator iterator)関数に伝達することにより、動的な呼び出しの異なるnext()、has Next()をサポートします。具体的には、print関数にArayタイプのオブジェクトを渡すと、print関数がArayのnext()、has Next()を呼び出します。私たちがprint関数にLinked Listタイプのオブジェクトを渡すと、print関数はLinked Listのnext()、has Next()の実現ロジックを呼び出します。
多形の意味
多形特性はコードの拡張性と多重性を向上させることができる。なぜですか?今挙げた例を振り返ってみましょう。その例では、多状態の特性を利用して、1つのprint関数だけで異なるタイプのデータを巡回印刷することができます。もう一つのタイプを遍歴する場合、例えば、HashMapを追加して、HashMapにIteratorインターフェースを実現させて、自分のhas Next()、next()などの方法を再実現すればいいです。print()関数のコードを変更する必要はありません。したがって、多形はコードの拡張可能性を高める。多形特性を使用しないと、異なる集合タイプを同じ関数に渡すことができません。私たちは、それぞれが巡回印刷する集合に対して、それぞれ異なるprint関数を実現する必要があります。例えば、Arayに対して、print関数を実現したいです。LinkdListに対して、print関数を実現したいです。多状態特性を利用して、一つのprint関数の印刷ロジックを実現するだけで、各種のセットデータの印刷操作に対応できます。これは明らかにコードの多重性を高めます。
これは多态の特性を利用して低カップリングを実现しました。例えば、私たちは新しい机能を追加して、前のコードを変えません。机能を削除します。