- 1 简介
简介
编辑Liskov替代原则(LSP)是子类型关系的一个特殊定义,称为强行为子类型,最初由BarbaraLiskov在1988年的会议主题演讲中提出,题目是数据抽象和层次结构。它基于可替代性的概念--面向对象编程中的一个原则,即一个对象(比如一个类)可以被一个子对象(比如一个扩展了第 一个类的类)取代而不破坏程序。
这是一种语义上的关系,而不仅仅是语法上的关系,因为它旨在保证层次结构中的类型,特别是对象类型在语义上的互操作性。BarbaraLiskov和JeannetteWing在1994年的一篇论文中简明扼要地描述了这个原则。
在同一篇论文中,Liskov和Wing详细介绍了他们在Hoare逻辑扩展中的行为子类型概念,它与BertrandMeyer的契约设计有一定的相似之处,因为它考虑了子类型与前提条件、后置条件和不变量的交互。
PrincipleLiskov的行为子类型概念定义了对象的可替代性概念;也就是说,如果S是T的一个子类型,那么程序中T类型的对象可以被S类型的对象取代而不改变该程序的任何理想属性(例如正确性)。
行为子类型是一个比类型理论中定义的典型的函数子类型更强的概念,后者只依赖于参数类型的逆向性和返回类型的协变性。行为子类型在一般情况下是不可判定的:如果q是x的方法总是终止的属性,那么程序(例如编译器)不可能验证它对T的某个子类型S成立,即使q对T确实成立。
Liskov替换原则对签名提出了一些标准要求,这些要求已经被新的面向对象的编程语言所采用(通常是在类的层次上,而不是在类型的层次上;区别见名义与结构子类型)。子类型中的方法参数类型的一致性。子类型中的方法返回类型的一致性。
子类型中的方法不能抛出新的异常,除非它们是超类型的方法抛出的异常的子类型。除了签名要求之外,子类型必须满足一些行为条件。这些条件以类似于契约设计方法论的术语详细说明,导致了对契约与继承的交互方式的一些限制。
前提条件在子类型中不能被加强。后提条件在子类型中不能被削弱。不变量在子类型中必须被保留。历史约束(历史规则)。对象被认为只能通过它们的方法进行修改(封装)。
因为子类型可以引入超类型中不存在的方法,这些方法的引入可能允许在子类型中进行超类型不允许的状态改变。历史约束禁止了这一点。这是由Liskov和Wing引入的新元素。对这个约束的违反可以通过将一个可变的点定义为不可变的点的子类型来说明。
这是对历史约束的违反,因为在不可变点的历史中,创建后的状态总是相同的,所以它不能包括一般的可变点的历史。然而,添加到子类型中的字段可以被安全地修改,因为它们不能通过超类型的方法来观察。
因此,我们可以把一个中心不可变、半径可变的圆定义为不可变点的子类型而不违反历史约束。起源前后条件的规则与BertrandMeyer在1988年出版的《面向对象的软件构造》一书中介绍的规则相同。
Meyer和后来的PierreAmerica(他是第 一个使用行为子类型的人)都给出了一些行为子类型概念的证明理论定义,但他们的定义并没有考虑到在支持引用或指针的编程语言中可能出现的别名问题。
将别名考虑在内是Liskov和Wing的主要改进,其中一个关键因素是历史约束。根据Meyer和America的定义,一个可变点将是一个不可变点的行为子类型,而Liskov的置换原则禁止这种情况。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/164280/