所有具体方法的抽象类

时间:2008-12-12 10:44:13

标签: java abstract-class

当有人在其中的所有方法都是具体的时候声明一个类摘要时,是否有一些实际的编程情况?

9 个答案:

答案 0 :(得分:15)

您可以使用模板方法模式,其中有多个覆盖点都具有默认实现,但组合的默认实现本身不合法 - 任何功能实现都必须是子类。

(是的,我不喜欢模板方法模式;))

答案 1 :(得分:5)

抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。它们无法实例化,所以如果你有一个带有具体方法的抽象类,那么它就可以被子类化,然后可以实例化子类。

答案 2 :(得分:4)

Immagine一个接口,其声明的方法在实现时通常显示相同的默认行为。编写需要支持接口的类时,必须反复定义所述默认行为。

为了便于实现具体类,您可能希望提供一个抽象类,为每个方法提供默认行为。要支持具体类中的接口,您可以从抽象类派生,并在它们偏离标准行为时覆盖方法。这样,您就可以避免重复执行相同(冗余)的默认行为。

答案 3 :(得分:2)

以前的答案已经解决了主要问题,但是可能值得一提的是一个小细节。

您可以拥有一个返回抽象类(隐藏)子类实例的工厂。抽象类定义了结果对象上的契约,并提供了默认实现,但是这个类是抽象的这一事实使它不能直接实例化,并且还表明“真实”实现类的身份不是公布

答案 4 :(得分:2)

另一个可能的用例是装饰器,它将所有调用委托给包装的实例。具体的装饰器实现只能覆盖添加功能的那些方法:

public interface Foo {
    public void bar();
}
public abstract class FooDecorator implements Foo {
    private final Foo wrapped;
    public FooDecorator(Foo wrapped) { this.wrapped = wrapped; }
    public void bar() { wrapped.bar(); }
}
public class TracingFoo extends FooDecorator {
    //Omitting constructor code...
    public void bar() {
        log("Entering bar()");
        super.bar();
        log("Exiting bar()");
    }
}

虽然我没有看到将FooDecorator声明为抽象的必要性(非抽象示例:HttpServletRequestWrapper)。

答案 5 :(得分:1)

想知道为什么没有人指出MouseAdapter的实际例子:

http://docs.oracle.com/javase/6/docs/api/java/awt/event/MouseAdapter.html

  

用于接收鼠标事件的抽象适配器类。方法中   这个班是空的。此类存在是为了方便创建   听众对象。

答案 6 :(得分:0)

Servlet示例:

所有方法都是具体的, 但是基类本身是没用的:

DeleteAuthor.java

  1. 带有具体doGet方法的抽象类。
  2. 受保护的字符串sql_path中指向
  3. doGet调用文件。
  4. sql_path为空

DeleteAuthor 保留 Book.java

  1. 扩展了抽象类DeleteAuthor
  2. 将sql_path设置为delete_author_ KEEP _BOOK.sql

DeleteAuthor 刻录 Book.java

  1. 扩展了抽象类DeleteAuthor
  2. 将sql_path设置为delete_author_ BURN _BOOK.sql

答案 7 :(得分:0)

如果您有一个重要的类,但系统无法为此类创建实例,因为

  • 这个类是系统很多类的父类;
  • 这有很多责任(很多类使用的方法)用于域名的要求;
  • 此类不代表具体对象;

答案 8 :(得分:0)

好问题:)

有一件事是肯定的......这肯定是可能的。 krosenvold的模板建议是这样做的一个很好的理由。

我只是想说一个类不能仅仅为了阻止它的实例化而声明abstract

这在Java语言规范Section 8.1.1.1

中引用
豫ICP备18024241号-1