将子类对象分配给Superclass实例类型仅是为了覆盖概念?还是我们还要这样做?


问题内容

您是否仅将子类对象分配给超类实例类型?还是我们还要这样做?

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

请解释。


问题答案:

当某人这样编写代码时,他/她正在尝试遵循基本的OO设计原则,即-

编写接口程序,而不是具体实现

我已经在我的一篇博客文章中解释了这一原理。在该Class Inheritance VS Interface Inheritance部分中查找。

总而言之,当您使用父类型的引用来引用子类型的实例时,您将获得很大的灵活性。例如,如果将来需要更改子类型的实现,则无需更改太多代码即可轻松实现。

考虑以下方法-

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

并调用此方法-

DoSomeStuff(new Sub());

现在,如果您需要更改内部逻辑someMethod,则可以通过声明的新子类型(Super例如NewSubType)并更改该实现内部的逻辑来轻松实现。这样,您将无需接触使用该方法的其他现有代码。您仍然可以DoSomeStuff通过以下方式使用您的方法-

DoSomeStuff(new NewSubType());

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

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

并且可能还会链接/冒泡到其他几个地方。