java应用中的子窗口切换,引出抽象类与接口的本质区别

今天一朋友问我,如何在一个java应用窗口(JFrame)中切换其内的子窗口(JInternalFrame)。

我想了一下,因为所有的子窗口都可以说是有共同特性的对象,觉得用抽象类来代表一个最原始的子窗口类,并在这个抽象类中建立一个方法专门来负责窗口切换,所有继承它的子窗口都可以用到这个方法来实现切换功能。

我一说抽象类,他说到现在还未搞懂抽象类还有接口到底是用来干什么的。而且上述问题为什么不用接口来实现,定义一个切换方法,所有实现它的子窗口都实现这个切换方法。暂且不说抽象类与接口的区别。现在将上述问题的简要代码给出:

抽象子窗口父类:

[java] 

  1. import java.awt.FlowLayout;
  2. import javax.swing.JInternalFrame;
  3. //所有子窗口的父类
  4. public abstract class Parent extends JInternalFrame {
  5.     MainFrame main;
  6.     public Parent() {
  7.     }
  8.     public Parent(MainFrame main) {
  9.         this.main = main;
  10.         //这里可以设置一些子窗口统一的属性,如背景,字体大小等等
  11.         this.setLayout(new FlowLayout(FlowLayout.CENTER));
  12.     }
  13.     //切换到其它子窗口的方法
  14.     public void toOtherFrame(Parent p) {
  15.         this.setVisible(false);
  16.         p.setVisible(true);
  17.     }
  18. }

 

 

大多数情况下,为了方便管理,程序需要找一个管理所有引用的对象,由于所有的子窗口都在应用窗口下,故让应用窗口对象来持众多子窗口对象。可以看出,用抽象类来实现,当我们要切换窗口时,只要子窗口继承了这个Parent类,其都可以当做一个切换对象传进来。

基于这个Parent类,创建欢迎子窗口(WelcomeFrame)与结束子窗口(GoodbyeFrame):

 

[java] 

  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3. import javax.swing.JButton;
  4. public class WelcomeFrame extends Parent{
  5.     public WelcomeFrame(MainFrame main){
  6.         //所有对象都同父类一样,持有管理者的引用。
  7.         super(main);
  8.         launchFrame();
  9.     }
  10.     private void launchFrame() {
  11.         this.setTitle(“WELCOME”);
  12.         this.setVisible(true);
  13.         JButton jb = new JButton(“去GOODBYEFRAME”);
  14.         jb.addActionListener(new ActionListener() {
  15.             @Override
  16.             public void actionPerformed(ActionEvent e) {
  17.                 //调用父类的切换方法,将要切换的子窗口对象传入
  18.                 WelcomeFrame.this.toOtherFrame(main.getOf());
  19.             }
  20.         });
  21.         this.add(jb);
  22.     }
  23. }

 

[java] 

  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3. import javax.swing.JButton;
  4. public class GoodbyeFrame extends Parent{
  5.     public GoodbyeFrame(MainFrame main){
  6.         //所有对象都同父类一样,持有管理者的引用。
  7.         super(main);
  8.         launchFrame();
  9.     }
  10.     private void launchFrame() {
  11.         this.setTitle(“GOODBYE”);
  12.         this.setVisible(true);
  13.         JButton jb = new JButton(“去WELCOMEFRAME”);
  14.         jb.addActionListener(new ActionListener() {
  15.             @Override
  16.             public void actionPerformed(ActionEvent e) {
  17.                 //调用父类的切换方法,将要切换的子窗口对象传入
  18.                 GoodbyeFrame.this.toOtherFrame(main.getWf());
  19.             }
  20.         });
  21.         this.add(jb);
  22.     }
  23. }

应用窗口(MainFrame):

 

 

[java] 

  1. import javax.swing.JFrame;
  2. public class MainFrame extends JFrame {
  3.     private WelcomeFrame wf = null;
  4.     private GoodbyeFrame of = null;
  5.     public WelcomeFrame getWf() {
  6.         return wf;
  7.     }
  8.     public void setWf(WelcomeFrame wf) {
  9.         this.wf = wf;
  10.     }
  11.     public GoodbyeFrame getOf() {
  12.         return of;
  13.     }
  14.     public void setOf(GoodbyeFrame of) {
  15.         this.of = of;
  16.     }
  17.     public static void main(String[] args) {
  18.         new MainFrame().launchFrame();
  19.     }
  20.     private void launchFrame() {
  21.         this.setBounds(200, 100, 400, 400);
  22.         this.setLayout(null);
  23.         wf = new WelcomeFrame(this);
  24.         of = new GoodbyeFrame(this);
  25.         wf.setBounds(0, 0, 385, 365);
  26.         of.setBounds(0, 0, 385, 365);
  27.         this.add(wf);
  28.         this.add(of);
  29.         this.setVisible(true);
  30.     }
  31. }

通过上述的例子,可以看出抽象类的使用确实为程序功能的实现提供很大的帮助,至少不至于为每个子窗口都写一个切换的方法,而且切换窗口的方法,所传递的对象也是java多态的一种体现。

 

回到同学的问题上,为什么不用接口?。

通常来说,站在语言本身的设计理念上来说,接口表示的是一种行为模型,一个类实现了某个接口,也就代表着其拥有某种行为能力,从java所提供的一些常用接口就可以看出这些特性,如Cloneable,Serializable,Comparable等等,上述问题为接口也不能说是错的,条条道路通罗马,但是使用接口需要为每个子窗口实现切换窗口的方法,不过接口可以提供很灵活的切换功能(如果需要的话)。

而对于抽象类,通常是”继承什么抽象类,就是什么”,说的是‘is’的概念,Parent是子窗口,其继承它的子类必然也是一个子窗口对象。

观点纯属个人理解,希望对大家的有所帮助,有不足之处,还望指出,共同学习,共同进步。

标签