gpt4 book ai didi

java - 我的讲师对 Liskov 替换原则的定义不正确,还是我误解了?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:52 25 4
gpt4 key购买 nike

由于 (Liskov) 替换原则,以下内容确实有效,该原则表示如果期望某个类的实例的引用,那么您可以替换对该类的任何子类的实例的引用。

public static void main( String[] args ) {
Cat felix = new Cat( );
Object copyCat = felix;
}

现在,据我所知,在这种情况下,我正在创建一个 Cat对象(因此在堆中创建了内存空间),然后我将一个名为“felix”的对象引用变量分配给新创建的 Cat目的。引用变量的类型为 Cat , 所以只能控制CatCat 的任何子类.

然后我正在创建一个 Object Object 类型的引用变量, 并将其指向 felix ( Cat ) 对象,该对象有效但功能有限,因为 JVM 现在看到类型为 Object 的 felix 对象,所以,如果例如有一个方法 purr()Cat 中定义类,felix 将无法再使用它。

因此需要一个类型为 Cat 的引用,但我们正在为 cat 类型的父类(super class)(而不是上面定义中所说的子类)提供引用,这是允许的,但功能有限(除非你进行强制转换)。

我说得对还是错了?

最佳答案

您所做的与 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(将“宽度”属性作为公共(public)属性)是错误的,因为 area() 方法对于 Shape1 和 Shape2 是不同的。

关于java - 我的讲师对 Liskov 替换原则的定义不正确,还是我误解了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5716013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com