Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 特征与开闭原理_Design Patterns - Fatal编程技术网

Design patterns 特征与开闭原理

Design patterns 特征与开闭原理,design-patterns,Design Patterns,正如维基百科所说的开放-关闭原则:在面向对象编程中,开放/关闭原则声明“软件实体(类、模块、函数等)应该为扩展而打开,但为修改而关闭” Trait是否打破了开闭原则?如果您在PHP中提到Trait,我相信不会,这与扩展类会打破这一原则是一样的。这一原则真正说明的是,我们应该以一种允许在不改变实现的情况下更改和添加新行为的方式来设计类。例: class Warrior { private $weapon; public function pickWeapon(Weapon $

正如维基百科所说的开放-关闭原则:在面向对象编程中,开放/关闭原则声明“软件实体(类、模块、函数等)应该为扩展而打开,但为修改而关闭”


Trait是否打破了开闭原则?

如果您在PHP中提到Trait,我相信不会,这与扩展类会打破这一原则是一样的。这一原则真正说明的是,我们应该以一种允许在不改变实现的情况下更改和添加新行为的方式来设计类。例:


class Warrior
{

    private $weapon;

    public function pickWeapon(Weapon $weapon)
    {
        $this->weapon = $weapon;
    }

    public function attack()
    {
        echo "Attacking with a ".$this->weapon->name;
    }

}

abstract class Weapon
{

    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

}

class Sword extends Weapon
{

}

class Axl extends Weapon
{

}

$sword = new Sword('word');
$warrior = new Warrior();
$warrior->pickWeapon($sword);
$warrior->attack();

通过这种方式,我的战士可以选择属于武器类的任何武器,我可以在不修改战士类的情况下更改剑中的实现或添加新类型的武器。很抱歉这个愚蠢的例子哈哈


我希望我能帮上忙。

如果你提到像PHP中那样的特性,我相信不是,这就等同于说扩展一个类会破坏这个原则。这一原则真正说明的是,我们应该以一种允许在不改变实现的情况下更改和添加新行为的方式来设计类。例:


class Warrior
{

    private $weapon;

    public function pickWeapon(Weapon $weapon)
    {
        $this->weapon = $weapon;
    }

    public function attack()
    {
        echo "Attacking with a ".$this->weapon->name;
    }

}

abstract class Weapon
{

    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

}

class Sword extends Weapon
{

}

class Axl extends Weapon
{

}

$sword = new Sword('word');
$warrior = new Warrior();
$warrior->pickWeapon($sword);
$warrior->attack();

通过这种方式,我的战士可以选择属于武器类的任何武器,我可以在不修改战士类的情况下更改剑中的实现或添加新类型的武器。很抱歉这个愚蠢的例子哈哈


我希望我能帮上忙。

为什么你认为性格会打破OCP?这不是一种改变吗?请举例说明你的意思。这里没有足够的信息来跟踪您的思维过程。你可以编辑这个问题来添加一些代码来显示违反OCP的特征。只要你有一个类,并且你为该类添加了一个特征以获得更多的功能,我认为这会中断OCPSOMETIME的修改部分添加一个特征就可以了。有时,它表明原始类没有足够的“开放扩展”。有时,这表明你不理解原始类应该如何扩展。为什么你认为特性会破坏OCP?这不是修改吗?请举例说明你的意思。这里没有足够的信息来跟踪您的思维过程。你可以编辑这个问题来添加一些代码来显示违反OCP的特征。只要你有一个类,并且你为该类添加了一个特征以获得更多的功能,我认为这会中断OCPSOMETIME的修改部分添加一个特征就可以了。有时,它表明原始类没有足够的“开放扩展”。有时,它表示您不理解原始类应该如何扩展。