Php “一个物体可以吗?”;“进化”;变成其中一个的对象';什么是儿童班?
假设我们有一个父类和一个子类。父类检查一些参数并确定子类更适合处理给定的请求-是否有方法将现有(父)对象重新创建为父对象中的子类对象 父类的示例:Php “一个物体可以吗?”;“进化”;变成其中一个的对象';什么是儿童班?,php,oop,inheritance,Php,Oop,Inheritance,假设我们有一个父类和一个子类。父类检查一些参数并确定子类更适合处理给定的请求-是否有方法将现有(父)对象重新创建为父对象中的子类对象 父类的示例: /** * Simple car */ class car { /** * The constructor */ public function __construct() { // (...) } /** * Add a sunroof to the car
/**
* Simple car
*/
class car {
/**
* The constructor
*/
public function __construct() {
// (...)
}
/**
* Add a sunroof to the car
*/
protected function addSunRoof() {
// (...)
}
/**
* Parse a config string and configure the car accordingly
* @param string $config
*/
public function configure($config) {
$options = explode(";", $config);
// Do something for every option in $config string
foreach ($options as $o) {
switch ($o) {
case "sunroof" :
$this->addSunRoof();
break;
case "4x4" :
// 'car' does not have support for '4x4', but the child class 'suv' does
// -> This 'car' object should therefore 'evolve' and become a 'suv' object - how?
case "foo" :
// (...)
} // switch
} // foreach
} // configure
} // car
子类的示例:
/**
* SUV car
*/
class suv extends car {
/**
* Add 4x4 drive
*/
protected function add4x4() {
// (...)
} // add4x4
} // suv
现在,获取suv
对象最明显的方法是从一开始就直接创建它:
$car = new suv();
$car->configure($config);
挑战在于,我不知道在创建对象时是否需要car
或suv
对象;我不知道$config
字符串包含哪些选项,直到在$car->configure()
方法中对其进行分析(字符串可以来自任何地方,例如用户输入)
一个简单的解决方法是将configure
方法移出car
,以便在创建任何对象之前分析字符串-但是,它在逻辑上属于car
对象,因此我确实希望将其保留在那里:)
有办法解决这个难题吗?如果不是,您认为什么是“最干净”的解决方法
提前谢谢
编辑:
正如有人指出的那样,我的问题与此非常相似:
答案是技术上可行,但不应该这样做。然而,一个令人信服的替代方案尚未被提出(有人建议使用工厂,但我觉得这只能解决问题的一部分)。如评论中所述,最常用的方法是使用静态方法,将字符串作为参数并返回正确的实例。 这样,您就可以将该方法保留在car类中,正如您所说,car类是最符合逻辑的
顺便说一下,如果更多的是关于在现有对象上添加特征的话。你可以考虑一下。通过这种方式,您可以有一个静态方法,获取配置字符串和现有汽车,并返回给定的汽车,其中装饰有与配置匹配的特性。这使您可以更灵活地处理所有的利弊(拖拉机上可以有遮阳棚)。家长不应该知道孩子的情况,到此为止。父母是独立的,孩子可以扩展和改变自己的行为;父母应该幸福地意识到这一点。子对象依赖于父对象,如果父对象也依赖于子对象,那么您有一个conumdrum。使用带有configure方法的CarFactory类返回最适合的实例如何?“configure”这个名称在这里不是最好的名称。@Voooza,Ashwin Mukhija:如果我正确理解工厂的概念,这意味着我必须解析配置字符串两次;一旦进入工厂决定要创建哪个对象,一旦进入对象本身,“使用字符串配置自身”是car类所需的功能,公共setter方法实际上不是一个选项。是否要动态重新配置汽车?当你在寻找停车位时,你想让你的车一离开高速公路就从法拉利换成哈默,换成迷你库珀?那太酷了。我也想要。否则,您可以从已配置的工厂选择您的汽车。