java - 将子类对象分配给 Superclass 实例类型只是为了重写概念?还是我们这样做也是为了其他事情?

标签 java oop

是否将子类对象分配给父类(super class)实例类型只是为了覆盖?还是我们这样做也是为了其他目的?

例子: Sub 是 Super 的子类型,并且 Super s = new Sub();

请解释。

最佳答案

当有人写这样的代码时,他/她试图遵循一个基本的 OO 设计原则,即 -

Program to an interface, not to a concrete implementation

我在one of my blog posts中解释过这个原理.查看类继承与接口(interface)继承部分。

总而言之,当您使用父类型的引用来引用子类型的实例时,您会获得很大的灵 active 。例如,如果您将来需要更改您的子类型实现,您将能够轻松地做到这一点,而无需更改太多代码。

考虑以下方法 -

public void DoSomeStuff(Super s) {
    s.someMethod();
}

并调用此方法 -

DoSomeStuff(new Sub());

现在,如果您需要更改 someMethod 中的逻辑,您可以通过声明 Super 的新子类型轻松实现,比如 NewSubType,并更改该实现中的逻辑。这样,您将永远不必触及使用该方法的其他现有代码。您仍然可以通过以下方式使用 DoSomeStuff 方法 -

DoSomeStuff(new NewSubType());

如果您将 DoSomeStuff 的参数声明为 Sub 的参数,那么您也必须更改其实现 -

DoSomeStuff(NewSubType s) {
    s.someMethod();
}

它也可能链接/冒泡到其他几个地方。

关于java - 将子类对象分配给 Superclass 实例类型只是为了重写概念?还是我们这样做也是为了其他事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16188122/

相关文章:

Java字符串提取

c++ - 多态,为什么我做不到?

JavaScript 对象继承与 IIFE?

oop - 实例变量是新的全局变量吗?

perl - 我如何从 Perl 中的具体类继承?

java - 在play框架的scala模板中转义sql保留字 "type"

java - 使用 log4j-web.jar 在 Web 应用程序中配置 Log4j2

java - 文件输出流 FileNotFoundException

java - 如何正确合并两个已排序的数组?

c++ - 有人可以解释这个继承代码吗?