是否仅为重写将子类对象分配给Superclass实例类型?或者我们是否也为此做其他事情?
实施例:
Sub是Super和的子类型
Super s = new Sub();
请解释。
答案 0 :(得分:6)
当有人写这样的代码时,他/她正试图遵循一个基本的OO设计原则,该原则说 -
编程到接口,而不是具体实现
我在one of my blog posts中解释了这个原则。查看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();
}
它也可能链接/冒泡到其他几个地方。
答案 1 :(得分:1)
是的,但“覆盖”不是我要使用的术语。通常,拥有类层次结构的原因不是改变超类的行为,而是实现它。通常,超类将是一个接口,而不是一个类,或者是一个遵循模板方法模式的抽象类,其中一些方法保持抽象,多个子类实现这些,但一般行为已经修复。
更具体地说,如果我们将子类分配给超类实例变量(如示例中所示),我们希望在交换子类的情况下限制对代码的影响(我们只需要编辑一行!)< / p>
答案 2 :(得分:0)
允许这种(将对象作为常见超类型的实例处理)的OO设计的特征称为polymorphism。
可以将子类型实例分配给超类型变量,以便以统一的方式处理所有可能的子类型,例如,使用超类型类声明(但可能被覆盖)的方法。
您可能会感兴趣的相关OO主题: