【问题标题】:is there a time you would ever need an abstract class without any abstract methods有没有时候你需要一个没有任何抽象方法的抽象类
【发布时间】:2013-12-28 19:51:08
【问题描述】:

我在玩抽象方法和类...有没有时候你会需要这样的东西而不是仅仅创建一个具体的类?

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

【问题讨论】:

  • 是的,如果您想要所有具体派生类的通用行为。

标签: java methods abstract


【解决方案1】:

抽象类可以提供默认实现。

考虑Java API中的MouseListener,以及对应的抽象类MouseAdapter

使用“纯”(非抽象)MouseAdapter 没有意义:所有方法都实现为无操作。但是,该类用作具体侦听器的抽象父类非常方便,因为您只需要覆盖您感兴趣的一个方法,而不必重新实现许多方法。操作。

没有必要将MouseAdapter 抽象化。这是一个完整的类。在不覆盖至少一种方法的情况下使用它是没有意义的。但除此之外,如果您希望它至少有一个 abstract 方法,则需要有 MouseListenerWithoutMouseClicked

另一个例子是state pattern。该接口定义了实际的 API。抽象类将实现(部分或全部)转换函数作为默认操作。每个状态只会覆盖那些方法,它会偏离默认行为。

一般来说,任何“抽象”方法声明可以(并且通常:应该)被移到接口中。尽管如此,我经常将它们声明为@Override abstract 的唯一原因是文档目的,以强调需要为具体实例实现哪些方法。 从接口继承的任何方法都将被有效地声明为抽象方法。

【讨论】:

  • 抽象类在某些情况下效果很好,但由于组件相互隔离,接口仍然要好得多。
  • 此外,即使在某些情况下,拥有一个仅具有默认行为的实例有时会很有用,为此目的定义一个密封类型可能会更干净,特别是如果这样的事情会使作为单身人士最有意义。
【解决方案2】:

当您想为子类应覆盖的方法提供默认实现时。特别是当默认实现是“什么都不做”或拥有“未实现”异常时。

JDK 中的一个例子是HttpServet,它具有处理四个http 方法(get、post、put 和delete)中的每一个的方法,其默认实现抛出ServletException,强制子类覆盖它们的那些方法想实施,但只有那些。如果调用,未实现的方法会爆炸。这很有意义,因为如果 Web 客户端使用意外的 Web 方法访问服务器,它会干净利落地抛出异常。

【讨论】:

    【解决方案3】:

    你可以这样做,但我会反对它。类层次结构非常不灵活,由于这段代码没有利用抽象方法,我会寻找一种替代方法来实现它。

    抽象类的重点在于它提供了一个模板,其中超类定义了抽象方法并在自己的方法中调用它们,因此子类指定了细节是如何发生的。这个例子中没有任何东西需要继承,所以我可以不用它。

    example Bohemian brings up 是适配器类的,它提供了多种方法的默认实现,因此您编写的类不必提供您根本不关心的方法的实现。那将是拥有一个没有抽象方法的抽象类的最佳时机(尽管适配器是否是抽象的并不那么重要)。

    【讨论】:

    • 抽象类中非抽象方法的定义为每个扩展它的类提供了一些默认功能。
    • @solvator: 是的,但是没有充分的理由在这里扩展抽象类,你最好使用接口和默认实现。
    • 在这种情况下,这是真的。我更喜欢使用接口
    猜你喜欢
    • 2011-06-16
    • 2011-07-10
    • 1970-01-01
    • 2017-04-10
    • 2014-10-30
    • 2020-03-12
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多