5

PHP で OOP を学ぼうとしていますが、今のところ抽象クラスに到達しています。

いつ抽象クラスに抽象メソッドを実装する必要があり、いつ実装すべきでないのかを理解するのに問題があります。

たとえば、次のコードがあります。

<?php

abstract class concept_car {
    /**
     * Properties can not be declared as abstract natively:
     * http://stackoverflow.com/questions/7634970/php-abstract-properties
     */
    protected $weelNum  = NULL;
    protected $doorsNum = NULL;
    protected $color    = NULL;
    protected $carType  = NULL;
    // the inheritance class must define this methods
    abstract public function setWeelNum($weelNum);

    abstract public function setDoorsNum($doorsNum);

    abstract public function setCarType($carType);
}

プロパティがメソッドと同じクラスにあるため、3 つのメソッドを抽象として宣言してもよいのか、それとも抽象を削除して実装する必要があるのか​​ わかりません。

コードの実際の形式では、ここでメソッドを抽象として宣言し、子クラスの継承クラスに実装する必要があると考えていましたが、これが正しい方法かどうかはわかりません。

PS: 私は初心者で、物事がどのように進むのかを理解しようとしています。まだ設計パターンに到達していないので、正しい進め方がわかるように概念を説明してください。

4

2 に答える 2

7

自問しなければならない簡単な質問:

これを拡張するすべてのクラスは同じことをしますか?

この例では、答えはイエスです。

public function setWeelNum($weelNum) {
  $this->weelNum = $weelNum;
}

そのため、各クラスでそのコードをコピーして貼り付けないでください。意味がありません。

いつ抽象メソッドを宣言する必要がありますか?

そのクラスのすべての子がこのメソッドを異なる方法で実装する必要がある場合。

たとえば、クラスAnimalでは、public abstract function move();すべての動物が移動するため、 がありますが、正確にどのように移動するかはわかりません。

于 2013-06-04T12:53:11.920 に答える
4

一般に、最後の共通の祖先にすべてのメソッドを実装する必要があります。したがって、子クラスを同じように動作させたい場合は、今すぐ実装してください。それらが実装されているが、多くの点で異なるクラスによって実装されている場合は、それらを抽象のままにしてください。

実際、抽象クラスは、誰かがこの共通クラスから何かを継承する場合、これらのメソッドを提供することを要求するためだけに行われます (抽象クラスはインターフェイスに似たものです)。

それらをすべて実装すれば、抽象クラスを使用する必要はありません。

于 2013-06-04T12:49:29.823 に答える