Javaプログラミングのアイデア---章VIII多型(上)

章VIIIの   多型(上)

  オブジェクト指向プログラミング言語では、継承と抽象化後の第3本質的な特徴の多型データです。

  インタフェースと実装分離の別のポイントから、それを行うために何をすべきか、どのように分離することにより多形性、マルチ状態に関係なく、プロジェクトが最初に作成されたときの、組織構造と可読性のコードだけでなく、スケーラブルなプログラムを作成する能力を向上させることができるだけでなく、新しい機能を追加する必要がある場合や、プログラムを成長させることができます。特性や行動を組み合わせることによって、新しいデータ型を作成するためのパッケージ。

 

8.1 上向きの遷移をもう一度

 

  我々はすでに知っている最後の章では、オブジェクトが使用する独自の型として使用することができ、あなたはまた、その基底クラスとして使用し、オブジェクトへの参照は、その基底クラスとして知られている練習への参照と見なされることができ上向きに推移。

// :デモ/ Note.javaの

パッケージcom.example.demo。

パブリック 列挙注{ 
    MIDDLE_C、C_SHARP、B_FLAT。
} 

// :デモ/ Instrument.javaの
パッケージcom.example.demo。
パブリック クラスインストゥルメント{ 公共 ボイドプレイ(注N){ システム。アウト(.println " Instrument.play()" ); } } // :デモ/ Wind.javaの パッケージcom.example.demo。
パブリック クラス風がインストゥルメント{拡張 公共 ボイドプレイ(注N){ システム。アウト .println(" Wind.play()" + N)。 } } // :デモ/ Music.javaの パッケージcom.example.demo。 パブリック クラス音楽{ 公共 静的 ボイドチューン(計測器I){ i.play(Note.MIDDLE_C)。 } パブリック 静的 ボイドメイン(文字列[]引数){ 風フルート = 新しい風()。 曲(フルート)。 } }

  出力は次のようになります。

  Wind.play()MIDDLE_C

 

  派生クラスでは、インターフェイスが移行を作ることが、すべての基底クラスのインタフェースを受け入れることができ、「ズームアウト」が、基底クラスのインタフェースよりもすべてではない狭いです。

 

8.1.1 オブジェクト・タイプを忘れます

 

パッケージcom.example.demo。

クラス弦楽器は、インストゥルメント{拡張
     公共 ボイドプレイ(注N){ 
        システム。アウト .println(" Stringed.play()" + N)。
    } 
} 

クラスブラス楽器{延び
     公共 ボイドプレイ(注N){ 
        システム。アウト .println(" Brass.play()" + N)。
    } 
} 

パブリック クラスMusic2 {
     公共 静的 ボイド曲(風I){
        i.play(Note.MIDDLE_C)。
    }

    
    }パブリック 静的 ボイド曲(弦楽器I){ 
        i.play(Note.MIDDLE_C)。
    } 

    パブリック 静的 ボイド曲(真鍮I){ 
        i.play(Note.MIDDLE_C)。
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 
        風フルート = 新しい風()。
        弦楽器バイオリン = 新しい弦楽器(); 
        ブラスホルン = 真鍮(); 
        曲(フルート)。
        曲(バイオリン)。
        チューン(ホルン)。
}

 

  出力は次のようになります。

Wind.play()MIDDLE_C

Stringed.play()MIDDLE_C

Brass.play()MIDDLE_C

 

  我々はこの方法をリロードすることを忘れた場合は、全体のプロセスは、操作の難しいタイプになるのため、コンパイラは、すべてのエラーメッセージを返しません。私たちは、パラメータとしてのみ、基本クラスを取る簡単な方法ではなく、特殊な派生クラスを記述する場合、それは良いでしょうか?これは、国家によって許可されるよりも多くのですが、ほとんどのプログラマは、プロセス指向プログラミングの背景を持って、操作の多状態モードでは少し混乱することがあります。

 

8.2 トランジット

 

8.2.1 バインディングメソッド呼び出し

 

  一つの方法は、同じメソッド本体が結合仲間と呼ばれる呼び出します。プログラムの実行前に結合した場合、事前バインディングと呼ばれます。コンパイラは一つだけであるとき、主な理由は、事前バインディングの上記のプログラムは、不可解な理由は、インストゥルメントの参照、私の息子を呼び出すためにどの方法を正確に知ることは不可能です。解決策は、彼は、実行時にオブジェクトの種類に応じてバインドされている意味、レイトバインディングです。

  Javaのに加えて、静的メソッドと、最終的な、他のすべての方法は、通常の状況下で、我々はそれが遅延バインディングを実行する必要があるかどうかを判断する必要はありません、それは自動的に行われますことを意味し、遅延バインディング方法に加えています。呼び出し最終の方法をカバーするから他のを防ぐが、より重要な点は、これが効果的に結合ダイナミック閉じることができるということであるので、コンパイラは、そのことができ、最終的な、より効率的なコードを生成するコール

 

8.2.2は、正しい動作を生成します

 

  あなたが知ったら、 Javaのすべてのメソッドは、これが本当である動的バインディングにより、多状態になった後、私たちは、基本クラスを扱うコードのみプログラムを書くことができ、およびコードは、すべての輸出カテゴリに正しく実行することができます。

  この例の幾何学的形状では、基本クラスが存在する形状とクラスの派生複数、それらの間に次の関係を示す継承グラフ。

 

 

 

  変換まで次の文のように簡単になります

形状s = 新しいサークル();

 

  ここで作成サークルオブジェクトをとに割り当てられた参照を取得するShapeを、それは間違っているようだが、継承によって、ので、実際には問題ないが、サークルの一種である形状

  あなたは、基本クラスのメソッドを呼び出すと仮定し、それが派生クラスで覆われています。

s.draw();

  あなたは再び呼び出すと思うかもしれないですドロー()それは、すべての後にされているための方法、形状参照し、コンパイラは他のことを何をすべきかを知っている方法ですか?後半多型である、結合、または正しく呼び出さ以降)Circle.draw(方法。

  シェイプそれが来るから継承する基本クラスを、すなわち、すべての行為は、これらの定義でカバー輸出のカテゴリは、ジオメトリの各特定のタイプのために、個々の動作を提供するために、描かれており、削除することができます。

 

8.2.3 スケーラビリティ

 

  今、私たちは楽器の例に戻ります。そのためどのような状態機構から、我々はを必要とせずに、自分のニーズに応じたシステムのように多くの新しいタイプを追加することができチューン()メソッド。うまく設計でOOPのプログラム、方法のほとんどが続くチューン()モデルを、ベースインタフェースと通信のみ。新しいデータ型にいくつかの機能を追加するために、共通の基本クラスから継承できるようにスケーラブルなときに、このようなプログラムは、それらの草の基本インタフェースは、新しいクラスに適用されるように変更する必要はありません。

  我们向乐器的基类添加更多的方法,并加入一些新类:

 

 

 

  事实上,不需要改动tune()方法,所有新类都能与原有类一起正确运行,及时tune()是单独放在某个文件中,并且在Instrument接口中添加了其他的新方法,tune()也不需要编译就能正确运行。下面是上图的具体实现:

 

おすすめ

転載: www.cnblogs.com/parable/p/11470203.html