里氏替换原则 (LSP):
Liskov Substitution Principle,简称:LSP。
所有使用基类的地方,都可以使用其子类来代替,而且行为不会有任何变化,子类型必须能够替换掉它们的父类型。
问题由来:
虽然有依赖倒置原则,但是写通用工具时,一般是很难做到面面俱到,使得成型工具能通用任何情况。
那么在开发时,一旦项目写到一半,增加的需求突然超出了 已有工具的能力范围 ,或者 和已有的工具功能有些不同。
这个时候如果去修改已有工具类,那么将会违反开闭原则,甚至会改成一团乱麻,导致工具需要重写,可能要浪费不少时间。
解决方案:
新建一个工具类来继承原有工具类,通过重写来覆盖修改原有功能,也能在其基础上新增功能。
并且这个新工具能被高层代码正常调用。
那么临时写的 新工具 将可以完全顶替 原工具 的工作,重写工具的计划也可以暂时搁置。
代码例子:
在Start里声明出A类
通过类注入来顶替高层类A的内部调用的B1
以此达到不修改A类来临时替换工具的目的。
并且可以方便通过A来拿到B2的新增功能。
结果:
public class ceshi003 : MonoBehaviour
{
void Start()
{
A a = new A();//实例化高层类
a.b1 = new B1();//注入底层工具
a.draw();
a.b1 = new B2();//注入新工具
a.draw();
((B2)a.b1).printf();//可调用的新功能
}
}
高层类
public class A //定义高层类A
{
public B1 b1;
public void draw()
{
Debug.Log("高层A调用:");
b1.draw1();b1.draw2(); //调用底层B1
}
}
原底层功能
public class B1
{
public virtual void draw1()
{
Debug.Log("b1方法1执行!!!");
}
public virtual void draw2()
{
Debug.Log("b1方法2执行!!!");
}
}
顶替的新功能
public class B2 : B1 //继承B1工具,修改一个功能
{
public override void draw1() //重写其中一个功能
{
Debug.Log("b2方法1执行!!!");
}
public void printf() //新增一个功能
{
Debug.Log("b2方法 printf 执行!!!");
}
}