当前位置: 首页 > 知识库问答 >
问题:

将子类对象赋给超类实例类型仅仅是为了重写概念吗?或者我们这样做也是为了别的什么?

张茂勋
2023-03-14

是否将子类对象分配给超类实例类型仅用于重写?或者我们这样做也是为了别的什么?

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

请解释一下。

共有1个答案

姚煜
2023-03-14

当某人编写这样的代码时,他/她试图遵循一个基本的OO设计原则,这个原则说-

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

我已经在我的一篇博客文章中解释了这个原则。请参阅类继承VS接口继承部分。

总结一下这篇文章,当您使用父类型的引用来引用子类型的实例时,您获得了很大的灵活性。例如,如果您将来需要更改子类型实现,您将能够轻松地完成此操作,而无需更改大量代码。

请考虑以下方法-

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

以及对此方法的调用-

DoSomeStuff(new Sub());

现在,如果您需要更改someMethod内部的逻辑,您可以通过声明super的新子类型(例如newsubtype)并更改该实现内部的逻辑来轻松地完成。这样,您就不必接触使用该方法的其他现有代码。您仍然可以通过以下方式使用DosomeStuff方法-

DoSomeStuff(new NewSubType());

如果您将dosomestuff参数声明为sub的参数,那么您还必须更改它的实现-

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

而且它还可能连锁/泡泡到其他几个地方。

 类似资料:
  • 问题内容: 您是否仅将子类对象分配给超类实例类型?还是我们还要这样做? 示例:Sub是Super的子类型, 请解释。 问题答案: 当某人这样编写代码时,他/她正在尝试遵循基本的OO设计原则,即- 编写接口程序,而不是具体实现 我已经在我的一篇博客文章中解释了这一原理。在该部分中查找。 总而言之,当您使用父类型的引用来引用子类型的实例时,您将获得很大的灵活性。例如,如果将来需要更改子类型的实现,则无

  • 问题内容: 我对Python 3中的和类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。 我目前的理解是,每个类(除外)都从称为的基类继承。但是每个类(包括)也是该类的一个实例,它是自身的实例,并且也从继承。 我的问题是: 是否有一个原因/设计决策,为什么是的实例并从中继承?对象的/ class是否也可以是对象本身? 类()如何成为其自身的实例? 哪一个是真正的基类或? 我一直认为这将是最“

  • 问题内容: 阅读其他人的代码,我已经看到很多: 我的问题是:用这种方式实例化它们的目的/优点是什么,而不是: 令我感到奇怪的是,我从未见过类似的东西: 要么 问题答案: 快速回答?使用接口和超类可以提高代码的可移植性和可维护性,主要是通过隐藏实现细节。采取以下假设示例: 我已经声明了一个帐户合同,该合同规定可以将已发布到该帐户的交易作为集合进行检索。我的代码的调用者不必关心我的方法实际上返回的集合

  • 有一个类别,具有以下(重要)属性: 我正在尝试实现类别/子类别的概念。一个类别可以有零个或多个子类别。一个类别只能有一个父类别(可以为null)。对于顶级类别,parentCategory=null。 现在,我有一个所有类别的列表,

  • 问题内容: 怎么有一个类的实例是,而该类不是的子类呢?这是一个例子: 问题答案: 在Python 2中, 类型 和 类 不是同一对象,特别是对于老式类, 它与对象是不同的。因此这是可能的,因为老式类的实例实际上是与其类不同的类型(): 这在新型类中得以解决: 旧样式类不是类型,新样式类是: 旧样式类被声明为已弃用。在Python 3中,只有新型类。等效于并且您的代码将在两次检查中产生。 看一下这个

  • 我理解超类/子类之间的关系以及强制转换是如何工作的。但是,我的问题是,如果知道中间有一个类,你能把一个超类转换成一个特定的子类吗?例如,如果我有一个动物类对象包含一个BigDog对象,我可以将该对象强制转换为Dog吗?如果BigDog中有Dog中不存在的方法怎么办? 简而言之,你当然可以说超类对象是子类对象,但为什么你可以反转呢? 转念一想, Java在调用方法时检查的是:引用(DOG)是否有引用