【问题标题】:Usage of abstract methods and classes unclear [duplicate]抽象方法和类的使用不清楚[重复]
【发布时间】:2018-06-01 01:14:17
【问题描述】:

我正在学习面向对象编程的概念。其中之一是抽象。我知道任何包含抽象方法的类也应该是抽象的,并且不能实例化抽象类。要使用抽象类,我必须从另一个类继承它。

到目前为止一切顺利。让我们看下面的代码:

public abstract class Games {

   public abstract void start();

   public void stop(){
       System.out.println("Stopping game in abstract class");
   }
}

class GameA extends Games{
   public void start(){
       System.out.println("Starting Game A");
   }
}

class GameB extends Games{

   public void start(){
       System.out.println("Starting Game B");
   }
}

然后我们有一个带有main 方法的类:

public class AbstractExample {

   public static void main(String[] args){
       Games A = new GameA();
       Games B = new GameB();

       A.start();
       A.stop();

       B.start();
       B.stop();
   }
}

但我本可以在Games 课堂上写下以下内容:

public void start(){
   System.out.print("");
}

那么它不必是abstract,输出将是相同的,我什至可以实例化Games 类。那么制作抽象方法和类的关键是什么?

【问题讨论】:

  • 软件工程堆栈上有一个good explanation
  • 如果你能想到一个理由让Games 成为一个具体的类,那么一定要继续实现那个方法。抽象适用于拥有实例没有意义的类。
  • 问问你自己,你提出的start() 方法是否有意义,如果没有,这就是为什么你可以将它标记为抽象:当提供一个虚拟实现没有意义时,并且使绝对清楚子类必须实现它。

标签: java abstract


【解决方案1】:

是的,所以从某种意义上说,抽象类/接口是要求您提供自己的合同实现的合同。例如,您正在编写一个可以写入文件、数据库等的日志库。考虑一下您将如何要求任何人实现持久化到底层 io 的功能。为了实现这一点,您可以让您的代码与您的接口/抽象类的实例一起工作。 现在这两者之间的区别就像接口没有实现一样简单。好吧,直到 Java 8,但没关系,这不是 ATM 需要关心的事情。 您的抽象类可以实现某些方法。例如,如果您的写入尝试没有成功,请重试。但实际的写操作只存在于实现它的那个。接口不行。

【讨论】:

    【解决方案2】:

    抽象类在单个程序员项目中没有多大意义。您可以将它们视为继承自该类的实现某些方法的程序员所获得的承诺。

    【讨论】:

    • 即使在单个程序员项目中抽象类也有意义,它们是行为模板,实现子类“填补空白”。
    • 你为什么要这样对自己? :)
    • 为什么不呢?它不会让它变得“更难”,它提供了一种自我文档形式,当您在数月甚至数年后重新访问该代码时可能会有所帮助。
    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多