将子类对象分配给Superclass实例类型仅用于覆盖概念?或者我们正在为其他内容执行此操作?

是否仅为覆盖将子类对象分配给超类实例类型? 或者我们是否也为此做其他事情?

示例:Sub是Super和Super s = new Sub();子类型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()); 

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

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

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

是的,但“重写”不是我会使用的术语。 通常,拥有类层次结构的原因不是改变超类的行为,而是实现它。 通常,超类将是一个接口,而不是一个类,或者是一个遵循模板方法模式的抽象类,其中一些方法保持抽象,多个子类实现这些,但一般行为已经修复。

更具体地说,如果我们将子类分配给超类实例变量(如示例中所示),我们希望在交换子类的情况下限制对代码的影响(我们只需要编辑一行!)

允许这种(将对象作为常见超类型的实例处理)的OO设计的特征称为多态 。

可以将子类型实例分配给超类型变量,以便以统一的方式处理所有可能的子类型,例如使用超类型类声明(但可能被覆盖)的方法。

您可能会发现有趣的相关OO主题:

  • 抽象类
  • 接口