3

私はまだクラスの使い方を学んでいて、いつextendsキーワードを使うべきか(クラスを拡張する)を考えていました。

物事Aを実行するクラスがあるとしましょう(そしてそれはシングルトンです)。クラスBが実際にはクラスAに関連していなくても、Bを実行する別のメソッドに拡張しても問題ありませんが、多くのメソッドを使用していますか?または、新しいクラスを作成する必要がありますか?

4

4 に答える 4

5

オブジェクト指向プログラミングに関しては、一般に、クラスはユーザー情報の保持や入出力制御などの特定のタスクを実行します。

たとえば、出力を制御するために使用される1つのオブジェクトがある場合、そのオブジェクト内にメソッドを設定して、出力タイプ、または各特定のコンテンツの処理方法を制御できますが、これは、オブジェクトの唯一の目的がコンテンツを送信するだけでなく、タイプに応じてコンテンツを操作しているため、壊れています。

これを克服するために使用する方法は、一連のタスクをクラス/オブジェクトのグループにグループ化することです。例:

abstract class Output
{
    public $content_type = 'text/plain';

    public function _send(){}
}

出力クラスには明らかにはるかに多くのメソッドがありますが、ヘッダーなどのコンテンツの出力に関連するメソッドのみがあり、コンテンツの操作はありません。次のようになります。

class HTMLOutput extends Output
{
     public $content_type = 'text/html';
}

およびコンテンツの操作について:

class CSSOutput extends Output
{
    public $content_type = 'text/css';

    public _send()
    {
         if($_SERVER['APP']['Settings']['CSSCompress'] == '1')
         {
             $this->_compress_css();
         }

         parent::_send();
    }

    private function _compress_css()
    {
         $this->content = ; //Some compression lib
    }
}

これは、多くのグループ化されたクラス/オブジェクトを作成および編成するときに私が従う主なアーキテクチャのポイントです。

于 2011-06-25T03:57:05.913 に答える
4

オブジェクト指向プログラミングでは、クラスがより具体的な用途を持つそのクラスの特別なタイプである場合、一般的にクラスは別のクラスを拡張する必要があります。

例:クラスBikeはAutomobileを拡張します

悪い例:クラスCarはBikeを拡張します(同様のメソッドを共有する場合がありますが、これは実際には意味がありません)

于 2011-06-25T01:36:32.680 に答える
2

シングルトンインスタンスを格納するための新しい静的メンバーを作成し、getInstance()メソッドをオーバーロードしてください。B::getinstance()そうでない場合は、両方のクラスに静的メンバーが1つしかないため、呼び出した場合でもインスタンスにアクセスすることになります。

于 2011-06-25T03:42:44.367 に答える
0

たとえば、両方のクラスでプライベート変数にアクセスする場合は、拡張機能を使用する必要があります。あなたの作品を見せていただければ、何をすべきか、すべきでないかをお伝えすることができます。

于 2011-06-25T01:35:55.220 に答える