组合优于继承原则是一种编程的设计原则,它建议我们在设计类的时候,优先考虑使用组合(也就是把一个类的对象作为另一个类的成员变量)来实现代码的重用,而不是通过继承来实现。
这个原则的主要好处是,组合比继承更加灵活。通过继承,子类会继承父类的所有方法和属性,有时候这可能会导致一些不需要的方法和属性也被继承下来,造成代码的冗余。而通过组合,我们可以只选择需要的部分进行组合,更加精确地控制代码的重用。
现在,我来用一个简单的PHP例子来说明这个原则。
假设我们要设计一个关于动物的程序,其中有一个类是“鸟”,另一个类是“会飞的鸟”。如果我们使用继承来实现,可能会像下面这样:
class Bird {
public function eat() {
echo "鸟吃东西";
}
}
class FlyingBird extends Bird {
public function fly() {
echo "鸟会飞";
}
}
在这个例子中,FlyingBird
类继承了 Bird
类,因此它自动拥有了 eat
方法。但是,如果我们想要添加一个不会飞的鸟呢?我们就需要再创建一个新的类,并且可能会重复写一些已经在 Bird
类中存在的方法。
现在,让我们使用组合来改写这个例子:
class Bird {
public function eat() {
echo "鸟吃东西";
}
}
class FlyingAbility {
public function fly() {
echo "可以飞";
}
}
class FlyingBird {
private $bird;
private $flyingAbility;
public function __construct() {
$this->bird = new Bird();
$this->flyingAbility = new FlyingAbility();
}
public function eat() {
$this->bird->eat();
}
public function fly() {
$this->flyingAbility->fly();
}
}
在这个改写后的例子中,我们创建了一个 FlyingAbility
类来表示飞的能力,然后在 FlyingBird
类中组合了 Bird
类和 FlyingAbility
类的对象。这样,FlyingBird
类就同时拥有了鸟的特性和飞的能力,但是它并没有继承 Bird
类,而是通过组合来实现的。这样做的好处是,如果我们想要创建一个不会飞的鸟,只需要去掉 FlyingAbility
类的组合部分就可以了,而不需要重新写一个类。
总结一下,组合优于继承原则就是建议我们在设计类的时候,优先考虑使用组合来实现代码的重用,而不是通过继承。这样做可以让我们的代码更加灵活、可维护,并且减少代码的冗余。