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 的工厂方法而不将其复制粘贴到 ClassB?我使用的是 PHP5,但不是 5.3.0。

4

3 回答 3

2

要做你想做的事,你需要Late Static Binding,所以你需要 PHP 5.3。在 PHP 5.2 中无法按您的意愿完成。人们已经尝试过了。

我在 5.2 中看到/使用的解决方法是

  1. 正如您提到的(并且不想这样做)将您的工厂方法复制到每个类中

  2. 要求工厂的最终用户提供他们正在实例化的类的名称作为参数

  3. 要求您的工厂实现一个接口或让它们从一个抽象类(或只知道约定)继承,该类需要定义一个静态“getClassName”方法,该方法将在工厂中使用。这类似于第一个,但有些人更喜欢它,因为它允许他们的工厂方法保留在“底层”类中。

于 2010-08-25T21:09:41.040 回答
0

我想这是Late Static Binding的情况。如果您不在 5.3 上,则必须复制它。

但是,您也可以从 ClassA 中删除工厂方法,并将其转换为知道如何创建 ClassA 和任何特殊类的专用 Factory 或 Builder 类。

于 2010-08-25T21:00:55.073 回答
0

在 PHP 5.3 中,这只是做的事情(参见后期静态绑定):

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 回答