gpt4 book ai didi

java - 里氏替换原理和类型转换

转载 作者:行者123 更新时间:2023-12-01 10:31:54 24 4
gpt4 key购买 nike

我刚刚在(Java)面向对象编程的讲座中遇到了里氏替换原则和转换。我明白原理是什么,也就是说,我可以用父类(super class)的类型初始化子类:

SuperClass superClass = new SubClass();

我首先关心的是此类操作的目的。为什么我不能像往常一样声明子类(示例如下)?

SubClass subClass = new SubClass();

就在这之后,我陷入了选角困境,如下:

SuperClass superClass = new SubClass();
SubClass subClass = (SubClass)superClass;

我再次很难理解这一切的意义。

任何人都可以澄清这些程序的目的吗?

最佳答案

里氏替换原则意味着子类应该在这样的理解下完成:您应该只真正关心实例在实例化时是什么子类。从那时起,它应该像父类(super class)一样被对待,没有添加方法或特殊处理。

这种方法的最大优点是,如果您决定用一个子类替换另一个子类,您可以!它的调用方式与之前的子类的调用方式完全相同。如果这对您的新子类不方便,那么 Liskov 会说这意味着它不应该真正成为该父类(super class)的子类。子类应该一视同仁。

关于您的转换,当您将 SubClass 分配给 SuperClass 时,您现在拥有一个可以在整个程序中使用的实例,而不必关心它是否是 SubClass。下面这行您尝试将 superClass 实例转换回子类可以可以完成,但是您可能没有正确执行某些操作(同样,因为您不应该关心它是什么子类)。

通常您会看到工厂或方法实例化它,如下所示:

public SuperClass getSuperClass() {
SubClass subClass = new SubClass();

// Here is the only place where you should perform subclass specific
// calls. The less you need to do here, the better.
subClass.setSubClassProperty(this);

return subClass;
}

请注意,当我返回一个子类实例并且调用者获得一个父类(super class)实例时,隐式转换为父类(super class)。这就是我们更喜欢的方式。调用者可以接收一个 SubClass 实例,但我们不希望调用者受到使用 SubClass 方法的诱惑。

关于java - 里氏替换原理和类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35041961/

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