我的讲师对“里斯科夫替代原则”的定义是否正确,还是我误会了?

| 由于(Liskov)替换原理,以下内容确实起作用,该替换原理表示,如果期望引用某个类的实例,则可以将引用替换为该类的任何子类的实例。
public static void main( String[] args ) {
Cat felix = new Cat( );
Object copyCat = felix;
}
现在,据我所知,在这种情况下,我正在创建一个“ 1”对象(因此正在堆中创建内存空间),然后将一个对象引用变量“ felix”分配给新创建的“ 1”。宾语。参考变量的类型为
Cat
,因此只能控制
Cat
Cat
的任何子类。 然后,我创建一个类型为
Object
Object
引用变量,并将其指向felix(
Cat
)对象,该对象可以工作,但是功能有限,因为JVM现在可以看到类型为object6ѭ的felix对象,因此,例如,如果有一个
Cat
类中定义的method10ѭ方法,felix将不再能够使用它。 因此,期望引用类型为
Cat
,但是我们为cat类型的超类(而不是上面定义中的子类)提供引用,并且允许这样做,但功能有限(除非您执行投)。 我是正确的还是遥遥无期?
已邀请:
您正在执行的操作与Liskov替代原则几乎没有关系。 该原则是了解继承是一个好主意,还是使用继承是错误的规则。显然,每个对象都从\“ Object \”继承:从Object继承永远不是一个错误。 这是LSP适用的示例: 如果你有 :
abstract class Shape {
  abstract public area();
}

class Shape1 extends Shape {
  private width;
  (...)
}
class Shape2 extends Shape {
  private width;
  private length;
  (...)
}
认为Shape2继承Shape1(将\“ width \”属性作为通用属性)是错误的,因为Shape1和Shape2的area()方法会有所不同。
在我看来,您是在考虑引用而不是对象,这就是为什么要颠倒规则的定义。 引用维基百科的原理版本: 如果S是T的子类型,则对象 类型T的对象可以替换为 类型S (这似乎与您提供的定义相同,我认为是您的指导者提供的) 在您的示例中,T为
Object
,S为
Cat
。当您具有类型T的引用时
Object copyCat;
替换原理说的是,此引用可以指向类型T的对象或类型T的子类的任何类型S的对象。因此,下列任一条件均有效:
copyCat = new Object();
copyCat = new Cat();
(由于我们在这里使用的是
Object
,根据定义它是任何Java类的超类,因此
copyCat
引用完全可以指向任何类型的对象。) 我认为这里重要的一点是,引用的类型决定了可以调用哪些方法,而无论实际对象指向的是哪种方法。这就是为什么可以将任何子类的实例分配给引用的原因。
它说的是Cat类可以有效替代Object类。因此,只要某些方法需要使用Object类型的对象,就可以替换Cat类型的对象。

要回复问题请先登录注册