0

複雑な静的ファクトリ メソッドを持つクラスがあり、それを ClassA と呼びましょう。ClassA を ClassB に拡張しました。ClassB のファクトリ メソッドで ClassA のファクトリ メソッドが行うすべてのことを行います (ClassB を返すことを除く)。

class ClassA{
   static public function Factory($construct_args, $contents){
      $new = new ClassA($construct_args);
      //Does lots of stuff with $contents
   }
}

class ClassB extends ClassA{
   //specialty methods and properties
}

echo get_class(ClassB::Factory($construct_args, $contents);

これは反響するはずですClassB

ClassA の Factory Method を ClassB にコピー アンド ペーストせずに使用する方法はありますか? PHP5 を使用していますが、5.3.0 は使用していません。

4

3 に答える 3

2

必要なことを正確に行うには、 Late Static Bindingが必要なので、PHP5.3が必要です。PHP5.2では希望どおりに実行できません。人々は試しました。

5.2で見た/使用した回避策は次のとおりです。

  1. あなたが言ったように(そしてやりたくない)あなたのファクトリメソッドを各クラスにコピーしてください

  2. ファクトリのエンドユーザーに、インスタンス化するクラスの名前を引数として指定するように要求します

  3. 工場でインターフェースを実装するか、工場で使用される静的な「getClassName」メソッドの定義を必要とする抽象クラスから継承する(または単に規則を知っている)ように工場に要求します。これはナンバーワンに似ていますが、ファクトリメソッドを「最下位」クラスのままにしておくことができるため、これを好む人もいます。

于 2010-08-25T21:09:41.040 に答える
0

PHP 5.3 では、実行するだけです ( late static bindings を参照):

static public function Factory($construct_args, $contents){
   $new = new static($construct_args);
   //Does lots of stuff with $contents
   return $new;
}

PHP 5.2 では、より創造的になる必要があります。何かのようなもの:

class ClassA {
   static function Factory($construct_args, $contents) {
       return self::privFactory($construct_args, $contents, "ClassA");
   }
   static protected function privFactory($construct_args, $contents, $type){
      $new = new $type($construct_args);
      //Does lots of stuff with $contents
      return $new;
   }
}

class ClassB extends ClassA{
   static function Factory($construct_args, $contents) {
       return self::privFactory($construct_args, $contents, "ClassB");
   }
}
于 2010-08-25T21:06:25.657 に答える
0

これはLate Static Bindingのケースだと思います。5.3 を使用していない場合は、コピーする必要があります。

ただし、ClassA からファクトリ メソッドを削除して、代わりに ClassA と特別なクラスを作成する方法を知っている専用の Factory または Builder クラスにすることもできます。

于 2010-08-25T21:00:55.073 に答える