Javaマルチステート理解

4175 ワード

Javaにおける多態性の実現
マルチステートとは
  • オブジェクト向けの3つの特性:パッケージ、継承、マルチステート.一定の観点から,パッケージと継承はほとんど多態のために準備されている.これは私たちの最後の概念であり、最も重要な知識点でもあります.
  • マルチステートの定義:異なるクラスのオブジェクトが同じメッセージに応答することを許可することを指す.すなわち、同じメッセージは、送信オブジェクトによって異なる動作方式を採用することができる.(メッセージの送信は関数呼び出しである)
  • マルチステートを実装する技術は、動的バインディング(dynamicbinding)と呼ばれ、実行中に参照されるオブジェクトの実際のタイプを判断し、その実際のタイプに基づいて対応する方法を呼び出すことを意味する.
  • マルチステートの役割:タイプ間の結合関係を除去します.
  • 現実では,多態に関する例は枚挙にいとまがない.例えば、F 1キーを押すという動作は、現在Flashインタフェースの下でポップアップされているのがAS 3のヘルプドキュメントです.現在Wordの下でポップアップされているのがWordヘルプです.Windowsの下でポップアップされるのが、Windowsヘルプとサポートです.同じイベントが異なるオブジェクトで発生すると、異なる結果が得られます.

  • 次は多態の存在の3つの必要条件で、みんなが夢を見る時すべて暗記することができることを要求します!
    多態が存在する3つの必要条件1、継承しなければならない.二、書き直さなければならない.三、親参照は子オブジェクトを指します.
    マルチステートのメリット:
    1.置換可能(substitutability).マルチステートは既存のコードに対して置換可能である.たとえば、マルチステートは円Circleクラスに対して動作し、円環などの他の任意の円形ジオメトリに対しても同様に動作する.2.拡張性(extensibility).マルチステートはコードに対して拡張性を有する.新しいサブクラスを追加することは、既存のクラスのマルチステート性、継承性、その他の特性の動作と操作に影響を及ぼさない.実際には、新しいサブクラスはマルチステート機能を獲得しやすい.例えば、円錐、半円錐および半球のマルチステートを実現した上で、球体クラスのマルチステート性を追加しやすい.3.インタフェース性(interface-ability).マルチステートは、メソッド署名によってサブクラスに共通のインタフェースを提供し、サブクラスによってそれを補完または上書きして実現される.図8.3に示すように、図中のスーパークラスShapeは、2つのマルチステートを実現するインタフェースメソッド、computeArea()およびcomputeVolume()を規定している.CircleやSphereのようなサブクラスは,マルチステートを実現するために,この2つのインタフェースメソッドを補完または上書きする.4.柔軟性(flexibility).アプリケーションにおいて柔軟で多様な操作を体現し、使用効率を向上させる.5.簡略化(simplicity).マルチステート簡略化はアプリケーションソフトウェアのコード作成と修正プロセスに対して、特に大量のオブジェクトの演算と操作を処理する際に、この特点が特に際立って重要である.
    Javaにおけるマルチステートの実装方式:インタフェース実装,親を継承してメソッド書き換え,同じクラスでメソッド再ロードを行う.
    小さなテーマ:
    (一)関連クラス
    class A ...{  
             public String show(D obj)...{  
                    return ("A and D");  
             }   
             public String show(A obj)...{  
                    return ("A and A");  
             }   
    }   
    class B extends A...{  
             public String show(B obj)...{  
                    return ("B and B");  
             }  
             public String show(A obj)...{  
                    return ("B and A");  
             }   
    }  
    class C extends B...{}   
    class D extends B...{}  

     
    (二)問題:以下の出力結果は何ですか.
    A a1 = new A();  
            A a2 = new B();  
            B b = new B();  
            C c = new C();   
            D d = new D();   
            System.out.println(a1.show(b));   ①  
            System.out.println(a1.show(c));   ②  
            System.out.println(a1.show(d));   ③  
            System.out.println(a2.show(b));   ④  
            System.out.println(a2.show(c));   ⑤  
            System.out.println(a2.show(d));   ⑥  
            System.out.println(b.show(b));    ⑦  
            System.out.println(b.show(c));    ⑧  
            System.out.println(b.show(d));    ⑨     

     
    (三)答え
    ①   A and A
    ②   A and A
    ③   A and D
    ④   B and A
    ⑤   B and A
    ⑥   A and D
    ⑦   B and B
    ⑧   B and B
    ⑨   A and D