抽象クラスとインタフェースの違いと使用シーン


  • 抽象クラスとインタフェースの違いと使用シーン
  • 1.1抽象クラス
  • 1.2インタフェース
  • 1.3抽象クラスとインタフェースの違い
  • 1.3.1文法レベルの違い
  • 1.3.2設計上の区別
  • 1.4抽象クラスとインタフェース
  • をいつ使用するか

    抽象クラスとインタフェースの違いと使用シーン
    1.1抽象クラス
    抽象クラスを理解する前に、抽象メソッドを理解してください.抽象的な方法は特殊な方法です.それは宣言だけで、具体的な実現はありません.抽象メソッドの宣言形式は次のとおりです.
    abstract void fun();

    抽象メソッドはabstractキーワードで修飾する必要があります.クラスに抽象メソッドが含まれている場合は、このクラスを抽象クラスと呼び、抽象クラスはクラスの前にabstractキーワードで修飾する必要があります.抽象クラスには具体的な実装方法がないため、抽象クラスでオブジェクトを作成することはできません.
    「JAVAプログラミング思想」という本では、抽象クラスを「抽象メソッドを含むクラス」と定義していますが、一つのクラスに抽象メソッドが含まれていない場合、abstractで修飾するだけで抽象クラスであることが後でわかります.すなわち,抽象クラスには必ずしも抽象的な方法が含まれなければならないとは限らない.個人的には、抽象クラスに抽象的な方法が含まれていない場合、なぜ抽象クラスとして設計されるのかという問題だと思います.だから、この概念をしばらく覚えておきましょう.なぜか深く考える必要はありません.
    [public] abstract class ClassName {
        abstract void fun();
    }

    ここから分かるように、抽象クラスは継承のために存在し、抽象クラスを定義して継承しないと、この抽象クラスを無駄に作成したのと同じです.それは何もできないからです.1つの親クラスでは、そのメソッドが親クラスで実装されても意味がなく、子クラスの実際のニーズに応じて異なる実装が必要である場合、このメソッドをabstractメソッドとして宣言することができ、このクラスもabstractクラスになります.
    抽象メソッドを含むクラスを抽象クラスと呼びますが、抽象クラスに抽象メソッドしかないという意味ではありません.通常クラスと同様に、メンバー変数と通常のメンバーメソッドを持つことができます.抽象クラスと一般クラスの主な違いは3つあります.
    1)抽象メソッドはpublicまたはprotectedでなければなりません(privateの場合、クラスに継承されず、サブクラスでは実現できません).デフォルトではpublicがデフォルトです.
    2)抽象クラスはオブジェクトの作成に使用できません.
    3)クラスが抽象クラスに継承されている場合、子クラスは親クラスの抽象メソッドを実装する必要があります.サブクラスが親クラスの抽象メソッドを実装していない場合は、サブクラスもabstractクラスとして定義する必要があります.
    他の面では,抽象クラスと普通のクラスには違いはない.
    1.2インタフェース
    インタフェースは、英語でinterfaceと呼ばれ、ソフトウェアエンジニアリングでは、インタフェースは一般的に他の人に呼び出される方法や関数を指す.ここから、Java言語設計者の初志を体得することができます.それは行為の抽象です.Javaでは、次のようにインタフェースを定義します.
    [public] interface InterfaceName {
    
    }

    インタフェースには変数とメソッドが含まれます.ただし、インタフェース内の変数はpublic static final変数として暗黙的に指定され(public static final変数のみであり、private修飾でコンパイルエラーが報告される)、メソッドはpublic abstractメソッドとして暗黙的に指定され、public abstractメソッドのみであることに注意してください.(private、protected、static、finalなどの他のキーワードでコンパイルエラーが報告されます)、インタフェース内のすべてのメソッドは具体的に実現できません.つまり、インタフェース内のメソッドは抽象的なメソッドでなければなりません.ここからインタフェースと抽出クラスの違いがわかります.インタフェースは抽象的な極度のタイプで、抽象的なクラスよりも「抽象的」ですを選択し、一般的にはインタフェースに変数を定義しません.特定のインタフェースのセットにクラスを従わせるにはimplementsキーワードを使用する必要があります.具体的なフォーマットは次のとおりです.
    class ClassName implements Interface1,Interface2,[....]{
    }

    1.3抽象クラスとインタフェースの違い
    1.3.1文法上の違い
    1)抽象クラスはメンバーメソッドの実装の詳細を提供することができ、インタフェースにはpublic abstractメソッドしか存在しない.2)抽象クラスのメンバー変数は様々なタイプであってもよく、インタフェースのメンバー変数はpublic static finalタイプのみである.3)抽象クラスには静的コードブロックと静的メソッドがあり、インタフェースには静的コードブロックと静的メソッドが含まれていない.4)1つのクラスは1つの抽象クラスしか継承できないが,1つのクラスは複数のインタフェースを実現できる.
    1.3.2設計上の違い
    1)抽象クラスは一つの事物に対する抽象,すなわちクラスに対する抽象であり,インタフェースは行為に対する抽象である.抽象クラスは、属性、動作を含むクラス全体を抽象化しますが、インタフェースはクラスのローカル(動作)を抽象化します.簡単な例を挙げると、飛行機と鳥は同類ではありませんが、共通性があり、飛ぶことができます.では、設計する時、飛行機を1つのクラスAirplaneに設計することができて、鳥を1つのクラスBirdに設計することができて、しかし飛行のこの特性もクラスに設計することができなくて、そのためそれはただ1つの行為の特性で、1種類の事物に対する抽象的な説明ではありません.このとき,飛行を方法fly()を含むインタフェースFlyとして設計し,AirplaneとBirdはそれぞれ自分のニーズに応じてFlyというインタフェースを実現することができる.そして、戦闘機や民間機など、さまざまな種類の飛行機がAirplaneを直接継承すればよく、鳥にも似ていて、異なる種類の鳥がBird類を直接継承すればよい.ここから,継承は「是非」の関係であり,インタフェース実装は「有無」の関係であることが分かる.あるクラスがある抽象クラスを継承している場合、サブクラスは必ず抽象クラスの種類であり、インタフェース実装は鳥が飛べるかどうか(あるいは飛行という特徴を備えているかどうか)、飛べるかどうかはこのインタフェースを実現することができ、飛べないかはこのインタフェースを実現しない.2)設計面が異なり,抽象クラスは多くのサブクラスの親としてテンプレート式設計である.インタフェースは放射式設計である挙動規範である.テンプレートデザインとは?最も簡単な例、みんなはすべてpptの中のテンプレートを使ったことがあって、もしテンプレートAでppt Bとppt Cを設計したら、ppt Bとppt Cの共通の部分はテンプレートAで、もしそれらの共通の部分が変更する必要があるならば、テンプレートAを変えるだけでいいので、ppt Bとppt Cを再び変更する必要はありません.放射線式の設計、例えばあるエレベーターには警報器が設置されており、警報器を更新するには、すべて更新しなければならない.すなわち、抽象クラスに対して、新しい方法を追加する必要がある場合は、抽象クラスに具体的な実装を直接追加することができ、サブクラスは変更しなくてもよい.インタフェースについてはだめで,インタフェースが変更された場合,このインタフェースを実現するすべてのクラスは相応の変更を行わなければならない.
    次に、ドアとアラートの例を見てみましょう.ドアにはopen()とclose()の2つのアクションがあります.この場合、抽象クラスとインタフェースを通じてこの抽象概念を定義することができます.
    abstract class Door {
        public abstract void open();
        public abstract void close();
    }

    または、
    interface Door {
        public abstract void open();
        public abstract void close();
    }

    しかし、ドアにアラームalarm()の機能が必要な場合は、どのように実現すればいいですか?次の2つのアイデアを提供します.
    1)この3つの機能を抽象クラスに入れるが,この抽象クラスに継承されたすべてのサブクラスはアラーム機能を備えているが,必ずしもアラーム機能を備えていないドアがある.
    2)この3つの機能をインタフェースに入れて、アラーム機能を必要とするクラスはこのインタフェースのopen()とclose()を実現する必要があります.このクラスはopen()とclose()の2つの機能を備えていないかもしれません.例えば、火災警報器です.
    ここから,Doorのopen(),close()およびalarm()は根本的に2つの異なるカテゴリ内の挙動に属し,open()およびclose()はゲート自体固有の挙動特性に属し,alarm()は拡張された付加的挙動に属することが分かる.したがって、最良の解決策は、アラームを単独でインタフェースとして設計し、alarm()動作を含み、Doorはopenとcloseの2つの動作を含む単独の抽象クラスとして設計することである.アラームゲートがDoorクラスを継承し、Alarmインタフェースを実現するように設計した.
    interface Alram {
        void alarm();
    }
    
    abstract class Door {
        void open();
        void close();
    }
    
    class AlarmDoor extends Door implements Alarm {
        void oepn() {
          //....
        }
        void close() {
          //....
        }
        void alarm() {
          //....
        }
    }

    1.4抽象クラスとインタフェースの使用時期
  • いくつかの方法を持っていて、デフォルトの実装をしたい場合は、抽象クラスを使用します.
  • 多重継承を実現するには、インタフェースを使用する必要があります.Javaはマルチ継承をサポートしていないため、サブクラスは複数のクラスを継承することはできませんが、複数のインタフェースを実現することができます.インタフェースを使用して解決することができます
  • 基本機能が変更されている場合は、抽象クラスを使用する必要があります.基本機能を変更し、インタフェースを使用する場合は、インタフェースを実装したすべてのクラスを変更する必要があります.