abstractクラスとabstractメソッド

5071 ワード

abstractを使用してクラスまたはメソッドを修飾できます.
abstractで修飾されたクラスはこのクラスが抽象的なクラスであることを表し、abstractで修飾された方法でこの方法が抽象的な方法であることを表す.
抽象クラスはインスタンス化できません.
抽象メソッドはメソッド宣言のみであり,メソッドの実装内容はない.
abstract抽象クラス
abstractを使用してクラスを修飾できます.
abstractで修飾されたクラスは、このクラスが抽象的なクラスであることを示します.
抽象クラスはインスタンス化できません.
これは単純で抽象的な方法であり,直接インスタンス化されるとシステムがエラーを報告する.
<?php  
//         
abstract class User  
{  
    public function __toString() {  
        return get_class($this);  
    }   
}  
//             
echo new User();  
?>

次の例のNormalUserはUserクラスから継承され、インスタンス化されます.
<?php  
//         
abstract class User  
{  
    public function __toString() {  
        return get_class($this);  
    }   
}  
//             
echo new User();  
class NormalUser extends User  
{  
}  
$a = new NormalUser();  
echo "   " . $a . "   ";  
?>

 
抽象クラスを単独で設定するのは意味がなく、抽象的な方法があってこそ、抽象クラスには血肉がある.抽象的な方法を紹介します.
abstract抽象メソッド
abstractで修飾されたクラスでこの方法を表すのは抽象的な方法である.
抽象メソッドは、メソッドの宣言部分のみで、メソッド体はありません.
抽象的な方法は{}ではなく、採用されている.終わります.
1つのクラスでは、抽象メソッドがある限り、このクラスは抽象クラスとして宣言されなければなりません.
抽象メソッドはサブクラスで書き直さなければなりません.
次に、setSal()とgetSal()の2つの抽象メソッドを持つ抽象クラスを示します.$sal従業員の給料を取り戻すために使用されます.
<?php  
abstract class User  
{  
    protected $sal = 0;  
    //         。  
    //           ,         ;  。  
    abstract function getSal();  
    abstract function setSal();  
    //    __tostring    
    public function __toString() {  
        return get_class($this);  
    }   
}   
?>

Userクラスが直接継承できない以上、NormalUserクラスがUserクラスから継承されていることを書きます.次のコードを書くと、システムがエラーを報告します.このエラーは,Userクラスには2つの抽象的なメソッドがあり,この2つのメソッドをサブクラスに書き直さなければならないことを示している.
<?php  
abstract class User  
{  
    protected $sal = 0;  
    //         。  
    //           ,         ;  。  
    abstract function getSal();  
    abstract function setSal();  
    //    __tostring    
    public function __toString() {  
        return get_class($this);  
    }   
}  
class NormalUser extends User  
{  
}  
?>

次の例では,この2つの方法を書き換えたが,方法体の中の{}の内容は空であるが,この方法を書き換えたと言える.書き換え方法のパラメータ名を見てください.ここではパラメータの数が一致すればいいので、パラメータの名前が一致する必要はありません. 
<?php  
abstract class User  
{  
    protected $sal = 0;  
    //         。  
    //           ,        ; 。  
    abstract function getSal();  
    abstract function setSal();  
    //    __tostring    
    public function __toString() {  
        return get_class($this);  
    }   
}  
class NormalUser extends User  
{  
    function getSal() {  
    }  
    function setSal($sal) {   
    }  
}  
    //        。  
?>

 
次の19-21行は、3つの書き方が間違っています.
19行、パラメータが見つかりません.
20行、パラメータがまた多くなりました.
21行、パラメータタイプが違います.(この書き方は後章でご紹介します)
1つのクラスで、抽象メソッドがある場合は、このクラスを抽象クラスとして宣言する必要があります.
次のクラスは抽象クラスではありません.抽象メソッドが定義されており、エラーが表示されます.
<?php  
class User  
{  
    protected $sal = 0;  
    //         。  
    //           ,        ; 。  
    abstract function getSal();  
    abstract function setSal();  
    //    __tostring    
    public function __toString() {  
        return get_class($this);  
    }   
}  
    //           ,          。     
?>

 
抽象クラスは抽象クラスを継承する
抽象クラスが別の抽象クラスを継承する場合、その抽象メソッドを書き換える必要はありません.
抽象クラスでは、抽象親クラスの抽象メソッドを書き換えることはできません.
このような用法は,抽象クラスへの拡張と理解できる.
次の例では,ある抽象クラスが別の抽象クラスから継承される場合,その抽象メソッドを書き換える必要がないことを示した.
<?php  
abstract class User  
{  
    protected $sal = 0;  
    abstract function getSal();  
    abstract function setSal($sal);   
}  
abstract class VipUser extends User  
{  
}  
?>

 
抽象クラスが継承された後、その抽象メソッドは書き換えられません.
書き換えが発生すると、システムがエラーを報告します.
<?php  
abstract class User  
{  
    protected $sal = 0;  
    abstract function getSal();  
    abstract function setSal($sal);   
}  
abstract class VipUser extends User  
{  
    abstract function setSal();   
}  
?>

抽象クラスは抽象クラスを継承し、抽象クラスの拡張を目的とする.
<?php  
abstract class User  
{  
    protected $sal = 0;  
    abstract function getSal();  
    abstract function setSal($sal);   
}  
abstract class VipUser extends User  
{  
    protected $commision = 0;  
    abstract function getCommision();  
    abstract function setCommision();  
}  
?>

 
PHP 5.1では、抽象クラスでは静的抽象メソッドがサポートされています.次の例では、静的抽象メソッドが宣言できることを示します.この方法を実現するには,静的な方法でなければならない.
静的抽象メソッド
PHP 5.1では、抽象クラスでは静的抽象メソッドがサポートされています.次の例では、静的抽象メソッドが宣言できることを示します.この方法を実現するには,静的な方法でなければならない.
<?php  
abstract class User  
{  
    protected static  $sal = 0;  
    static abstract function getSal();  
    static abstract function setSal($sal);   
}  
class VipUser extends User  
{  
    static function getSal() {  
        return self::$sal;  
    }  
    static function setSal($sal) {  
        self::$sal = $sal;  
    }  
}  
VipUser::setSal(100);  
echo "you sal is " . VipUser::getSal();  
?>  
//