PHPオブジェクト向け-抽象クラスとインタフェース

2958 ワード

抽象メソッド
  • 抽象メソッドabstractおよびpublic(省略可能)キーワードを使用して
  • を宣言する
  • 抽象メソッドには、具体的な実装はできません(コードはありません)
  • 抽象クラス
    私たちは抽象方法をサブクラスに再ロードするテンプレートとして使用し、抽象クラスを定義することは規範を定義することに相当し、この規範はサブクラスに守られ、サブクラスは抽象クラスを継承した後、抽象クラスの中の抽象方法をサブクラスの需要に応じて実現しなければならない.
  • 抽象クラスabstractキーワードを使用して
  • を宣言
  • クラスに抽象メソッドが含まれている場合は、このクラスが抽象的な
  • であることを宣言する必要があります.
  • 抽象クラスをインスタンス化することはできません.それらを継承し、サブクラスをインスタンス化する必要があります.抽象クラスをサブクラスのテンプレートと見なすこともできます.
  • すべての(親チェーン)の抽象的な方法を上書きすると、サブクラスは普通のクラスになります.そうでなければ、サブクラスは抽象的です.

  • 抽象クラスと抽象メソッドの使用例:
    //abstract root class        
    abstract class Shape 
    { 
        abstract function getArea(); //         
    } 
        
    //abstract child class      
    abstract class Polygon extends Shape //    
    { 
        abstract function getNumberOfSides(); 
    } 
        
    //concrete class          
    class Triangle extends Polygon 
    { 
        public $base; 
        public $height; 
            
        //         
        public function getArea() 
        { 
            return(($this->base * $this->height)/2); 
        } 
    
        //         
        public function getNumberOfSides() 
        { 
            return(3); 
        } 
    } 
    

    インタフェース
    PHPは多くのオブジェクト向けプログラミング言語と同様に多重継承はサポートされていない.つまり、クラスごとに1つの親しか継承できません.この問題を解決するために,PHPはインタフェースを導入し,インタフェースを実現するクラスが実現しなければならない一連の方法を指定したと考えられる.
  • インタフェースは特殊な抽象クラスであり、抽象クラスはまた特殊なクラスであるため、インタフェースも特殊なクラス
  • である.
  • クラスを宣言するときに使用するキーワードはclassですが、インタフェースは特殊なクラスで、使用するキーワードはinterface
  • です.
  • インタフェース内のすべてのメソッドは抽象メソッドとして宣言する必要があります
  • インタフェース内のすべてのメソッドは抽象メソッドであるため、抽象メソッドを宣言する際にabstractキーワード
  • を使用しないでください.
  • インタフェースでは変数は宣言できません(ただしconstキーワードで定数constantを宣言できます)
  • インタフェースのすべてのメンバーはpublic権限です.したがって、サブクラスは、実装時にpublic権限を使用して
  • を実装する必要があります.
  • インタフェースはインスタンスオブジェクトを生成できません.すべての抽象メソッド(親チェーン)は
  • を実装するためにサブクラスを必要とします.
  • extendsキーワードを使用して、1つのインタフェースに別の(複数の)インタフェース
  • を継承させることができる.
  • インタフェースのサブクラスを定義してインタフェース内のすべての抽象メソッドを実装するために使用されるキーワードはextends
  • ではなくimplementsである.
  • クラスには1つの親しかありませんが、1つのクラスは複数のインタフェース
  • を実現できます.
  • 一つのクラスは複数のインタフェースを実現することができ、一つのクラスを継承すると同時に複数のインタフェースを実現することができ、必ずクラスを継承してからインタフェース
  • を実現しなければならない.
    インタフェースの使用例:
    //    
    interface A
    {
        function a_func();
    }
    interface B
    {
        function b_func();
    }
    interface C
    {
        function c_func();
    }
    interface D
    {
        function d_func();
    }
    
    //             (  )  
    interface E extends A,B
    {
        function e_func();
    }
    
    //         
    abstract class X implements C
    {
        abstract function x_func(); 
    }
    
    //            
    class Demo extends X implements D,E
    {
        function a_func()
        {
            //...
        }
        function b_func()
         {
            //...
        }
        function c_func() 
        {
            //...
        }
        function d_func() 
        {
            //...
        }
        function e_func() 
        {
            //...
        }
        function x_func()
        {
            //...
        }
    }
     
    //        ,                
    $demo = new Demo();
    

    参考記事:【PHPオブジェクト向け(OOP)プログラミング入門チュートリアル】19.抽象メソッドと抽象クラス(abstract)【PHPオブジェクト向け(OOP)プログラミング入門チュートリアル】20.PHP 5インタフェース技術(interface)