当前位置: 首页 > 后端技术 > PHP

不同面向对象(三)

时间:2023-03-29 17:06:30 PHP

设计模式六大原则字面量替换原则(LSP)定义:所有对基类的引用必须被其子类透明地替换(简单的说:子类可以扩展基类的功能,但不能改变基类的原有功能)基类中的替换原则是继承和重用的基石。只有当子类能够替代基类并且其他功能不受影响时,才认为基类真正可以被重用,子类可以在基类的基础上增加新的方法。替换原则的核心是继承。通过继承,可以在引用基类的地方使用子类的对象。继承的优点(1)代码共享,每个子类都有父类的方法和属性(2)提高了代码的复用性(3)子类可以在父类的基础上扩展自己特有的功能继承(1)继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法(2)降低代码的灵活性。子类必须具有父类的属性和方法(3)以增强耦合。当修改父类的常量、变量和方法时,必须考虑子类的修改(2)子类可以添加自己特有的方法(3)当子类重写或实现父类的方法时,前置条件方法的参数(即方法的形参)高于父类。类方法的入参更宽松(4)子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)比类方法的后置条件更严格父类1.子类必须实现父类抽象方法,但不得覆盖(override)父类的非抽象(实现)方法shot();}}classBaili{publicfunctionshot(){echo"Baili开始射击".PHP_EOL;}}classMengya{publicfunctionshot(){echo"MengYa开始射击".PHP_EOL;}}$shooter=newShooter();$shooter->shot(new百里());上面这个类,实现了正常的功能,但是因为射手类的射击(shot)功能是基于具体的类百里(Baili)来实现的,这会给以后的扩展带来麻烦。这时候新来了射手梦娅,但是按照射手职业的射击方式,除非修改射手职业的射击方式,否则梦娅是不能射击的。按理说只要是射手属性的英雄,应该都能提升射击。shooter类中的射击方法不应依赖于具体的射手英雄,而应该是对射手的泛指攻击();}publicfunctionaccack(){}}interfaceBaseShooter{publicfunctionshot(BaseShooter$shooter);publicfunctionaccack();}classBailiextendsShooter{publicfunctionattack(){echo"Baili开始射击".PHP_EOL;}}classMengyaextendsShooter{publicfunctionattack(){echo"Mongya开始射击".PHP_EOL;}}$shooter=newShooter();$shooter->shot(newBaili());这样扩展起来会比较容易,耦合度没有上面的方法大