1. 抽象クラス
オブジェクトがクラスを通じて生成されることはわかっていますが、すべてのクラスが特定のオブジェクトを記述できるわけではありません。
クラスに特定のオブジェクトを説明するのに十分な情報が含まれていない場合、そのクラスは抽象クラスになります。抽象クラスは、同じ特性を持つがパフォーマンスの詳細が異なるオブジェクトのクラスを抽象化したものです。たとえば、鳥はすべて鳴きますが、異なる鳥は異なる鳴き方をします。「鳴き声」という概念は抽象化できます。
以下のbirdを定義します:
public abstract class Bird { private String color; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public Bird(){ } public abstract void sing();//鸣叫 } //喜鹊 class Magpie extends Bird{ public void sing() { System.out.println("I can sing in a whisper. "); } }
抽象クラスの特徴:
(1) 抽象クラスを抽象キーワードで変更します
(2) 抽象クラス内の抽象メソッドを抽象キーワードで変更し、メソッド本体はありません (特定の実装)。
(3) 抽象クラスには非抽象メソッドを含めることができます
(4) 抽象クラスには抽象メソッドを含める必要はありません (抽象クラスとして設計することに意味はありません...) が、抽象メソッドを含むクラスは抽象メソッドを含める必要があります。抽象クラスであること
(5) 抽象クラスは本質的にクラスであり、継承のみが可能です
(6) 抽象クラスはインスタンス化または新規作成できません。前に、それは特定のオブジェクトを記述するものではなく、インスタンス化することもできないと述べました。 (7) 抽象クラスはインスタンス変数と構築メソッドを持つことができます。何ができるかを規定しています。ソフトウェア設計プロセスは、具体的な実装ではなく抽象化に依存します。
コンピューターの USB インターフェースと同様、ハードディスク、USB フラッシュ ドライブ、携帯電話のいずれであっても、USB で指定されたインターフェースを実装していれば、コンピューターに接続できます。
上記の抽象クラスの例では、ペンギン、ダチョウ、アヒルなど、すべての鳥が飛べるわけではないことを考慮して、「飛ぶ」機能を追加したいと考えています。
抽象クラスを変更することは明らかに不適切です。 1. 開閉の原則に違反します。 2: すべてのサブクラスが「飛行」関数を継承することになり、アヒルが空を飛んでいるのを見ることになります ^_^ 。
次のインターフェイスを定義できます:
public interface IFly { void fly(); }
// Magpie は IBird でインターフェイスを実装できます:
class Magpie extends Bird implements IFly { public void sing() { System.out.println("I can sing in a whisper. "); } public void fly(){ System.out.println("我会飞了!"); } }
Magpie は IFly で fly インターフェイスを実装し、最終的に飛行できるようになりました。
それでは、鳥に水泳機能を追加する必要がある場合はどうすればよいでしょうか?自分のためだと思います。 。 。
インターフェースの特徴:
(1) 修飾子: public、abstract、default (書かないでください)
(2) キーワード:interface
(3) インターフェース内のメソッドは抽象メソッドであり、実装できません。
(4) インターフェース内のメソッドはデフォルトでパブリック抽象であり、実装クラスはパブリック変更を使用する必要があります。
(5) インターフェース内のすべてのメソッドは実装クラスに実装する必要があります(抽象クラスを除く)。
(6) インターフェース内の変数は、デフォルトでは public static Final です。
(7) クラスは複数のインターフェースを実装できます。
3. アプリケーション シナリオ
1) 抽象クラスは、「である」関係を反映します。特定のクラスの実装に共通点がある場合、抽象クラスを抽象化し、その抽象クラスに共通のコードを実装させることができます。パーソナライズされたメソッドは各サブクラスによって実装されます。
2) インターフェースは「似た」関係を反映し、異なるタイプのオブジェクトの抽象的な動作を表します。例えば、飛行機や鳥は空を飛ぶことができ、飛ぶためのインターフェースは取り外すことができますが、それらは同じ種類のものではありません。
3) ソフトウェア設計において、インターフェイスを実装から分離し、変更をカプセル化する必要がある場合、インターフェイス指向のプログラミングが特に重要です。
たとえば、IOC の考え方では、クライアントはあなたがどのクラスであるかを気にせず、特定のオブジェクトがコンテナによって注入されます。
もう 1 つの例は、2 つのシステム間の相互作用です。これにより、双方がインターフェイスを提供し、変更をカプセル化する際の結合が軽減されます。
多くの設計原則、設計アイデア、設計パターンは、インターフェイス指向プログラミングの重要性を反映しています: 開閉の原則、インターフェイスの分離、依存関係の反転、アダプター パターンなど。