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

时间:2013-04-24 09:17:13

标签: java oop

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

实施例: Sub是Super和的子类型 Super s = new Sub();

请解释。

3 个答案:

答案 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主题: