有没有一段时间你需要一个没有任何抽象方法的抽象类



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

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 API中的MouseListener和相应的抽象类MouseAdapter

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

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

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

通常,任何"抽象"方法声明都可以(通常:应该)移动到接口。然而,我经常将它们声明为@Override abstract的唯一原因是出于文档目的,强调需要为具体实例实现哪些方法。从接口继承的任何方法都将有效地声明为抽象方法。

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

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

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

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

Bohemian提出的例子是适配器类,它提供了多个方法的默认实现,因此您编写的类不必提供您无论如何都不关心的方法的实现。这将是拥有一个没有抽象方法的抽象类的最佳时机(尽管适配器是否抽象并不重要)。

相关内容

最新更新