抽象派生类中的抽象方法覆盖/实现抽象基类的抽象或具体方法。如何以及为啥?

Posted

技术标签:

【中文标题】抽象派生类中的抽象方法覆盖/实现抽象基类的抽象或具体方法。如何以及为啥?【英文标题】:Abstract method in abstract Derived class overrides/implements abstract or concrete method of abstract Base class. How and why?抽象派生类中的抽象方法覆盖/实现抽象基类的抽象或具体方法。如何以及为什么? 【发布时间】:2017-09-26 14:41:26 【问题描述】:

遇到有趣的继承/覆盖问题(取自 here)。

当基类和派生类都是抽象类时,并且

    两者都有完全相同的抽象方法,或者 abstract Base 有具体方法,Derived 声明 SAME 方法抽象。

我不明白为什么 Eclipse IDE 在 Derived 中调用它

    实现(它在 Derived 中不提供代码/正文!) 覆盖(在 Derived 中也给出了 NO CODE / BODY!)

片段 1:

public abstract class Girl 
     abstract String getDescription();



abstract class GirlDecorator extends Girl 
       abstract String getDescription();  // implements Girl.getDescription() - says Eclipse IDE

片段 2:

public abstract class Girl 
    String description = "no particular";

      String getDescription() 
          return description;
      


abstract class GirlDecorator extends Girl 
       abstract String getDescription();  // overrides Girl.getDescription() - says Eclipse IDE

【问题讨论】:

您忘记了@Override 注释。 “Implements”是“overrides”的一个特例,它提供了一个实现。允许用抽象方法覆盖。 【参考方案1】:

在 Java 中有两种类型的方法(非静态)

    Virtual - 普通方法,必须在基类中实现,但可以通过继承覆盖。

    抽象 - 未在基类中但在派生类中实现的方法。

因此包装它,虚拟方法不在派生类中实现,它们在基类中实现并且可以被派生类覆盖。 抽象方法不在基类中实现,而是在派生类中实现。

【讨论】:

以上是关于抽象派生类中的抽象方法覆盖/实现抽象基类的抽象或具体方法。如何以及为啥?的主要内容,如果未能解决你的问题,请参考以下文章

C#中接口和抽象类

虚方法抽象方法接口方法

C# 中基类,虚类,抽象类,密封类,接口的区别

派生自抽象基类并调用另一个类中的方法的 C++ 包装类,该类也派生自抽象基类

什么是抽象类什么是接口两者有什么区别?如何使用它(转载)

Scala 中的特征和抽象方法覆盖