2

我正在用 Java 编写一个简单的网络浏览器。我有一个类 WebBrowserPane,它扩展了 JEditorPane 并将其设置为更好地显示网页(禁用编辑,添加 HyperlinkListener 等)。然后,我有一个类 WebBrowserFrame,它扩展了 JFrame,并在顶部放置了一些按钮和地址栏,在下方放置了 WebBrowserPane。不过,我希望它能够接受任何扩展 JEditorPane 并具有相关方法的东西,而不是只能在下面放置一个 WebBrowserPane。

我写了一个抽象类 AbstractBrowser 来实现这个:

import javax.swing.JEditorPane;

public abstract class AbstractBrowser extends JEditorPane {
public void back(){}
public void forward(){}
public void refresh(){}
}

WebBrowserPane 然后扩展 AbstractBrowser:

public class WebBrowserPane extends AbstractBrowser {
WebBrowserPane(){
    setEditable(false);

    //etc
}
public void back(){
    //blah
}
}

WebBrowserFrame 然后将任何 AbstractBrowser 作为参数:

public class WebBrowserFrame extends JFrame{
WebBrowserFrame(AbstractBrowser a){
    add(a);
}
}

显然,这并不能确保抽象类方法永远被覆盖,所以我意识到这不是一个很好的解决方案。有没有办法使用接口来实现这一点?

4

2 回答 2

1

您可以让您的子类扩展 JEditorPane,然后创建一个与您现在拥有的抽象类相同的接口,并让您的子类也实现该接口。

于 2012-12-12T17:26:28.787 回答
1

问题是接口不能扩展 JEditorPane。但是您可以在抽象类中声明抽象方法,编译器会强制任何子类覆盖它们:

import javax.swing.JEditorPane;

public abstract class AbstractBrowser extends JEditorPane {
    public abstract void back();
    public abstract void forward();
    public abstract void refresh();
}
于 2012-12-12T17:24:58.477 回答