将子类对象分配给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主题:
- 抽象类
- 接口