簡體   English   中英

無法更改子類中的公共變量類型

[英]Cannot change public variable type in a subclass

我需要創建一個更改變量類型的子類。

我的目的是創建一個 class 將對象動態加載到表單上。 此表單可以是JFrameJInternalFrame ,所以我想要一個 class 引導一個屬性表單,該表單可以是JFrame / JInternalFrame之一,因此我可以編寫方法沒有重復的代碼和功能

就像是

public class form {

    public javax.swing.JFrame frm;
...... methods and functions.

    public void init(String title)
    {

        frm = new JFrame(title);
    }

}

class form_children extends form {
    public javax.swing.JInternalFrame frm;

    public void init(String title)
    {

        frm = new JInternalFrame(title);
    }
}

這樣當我使用它們時,我可以做這樣的事情

public form_to_create (String title, Boolean mdi_child)
{
        if (mdi_child)
            frm = new form_children();
        else
            frm = new form();

        frm.init();
        frm.dosomething -----> error for null object
}

但是當我使用mdi_child時,它給了我 null object 的錯誤。 似乎超級 class 的frm變量存在,但子類的frm不存在。 為什么?

我需要創建一個更改變量類型的子類。

我的目的是創建一個 class 將對象動態加載到表單上。 此表單可以是 JFrame 或 JInternalFrame,所以我想要一個 class 引導一個屬性表單,該表單可以是 JFrame / JInternalFrame 之一,因此我可以編寫沒有重復代碼的方法和函數。

通過讓 class 擴展 JFrame、JInternalFrame 或其他頂級(或內部頂級)window,您將自己畫在一個角落里,因為這通常會迫使您創建和顯示更多的靈活性類型。 事實上,我敢冒險,我創建的大部分 Swing GUI 代碼並沒有擴展 JFrame,事實上你很少會想要這樣做。 更常見的是,您的 GUI 類將用於創建 JPanel,然后可以將其放入 JFrames、JInternalFrames 或 JDialogs 或 JTabbedPanes,或在需要時通過 CardLayouts 交換。 這將大大增加您的 GUI 編碼的靈活性。

謝謝。

我想動態創建我的表單,並將其視為 mdichild window 或非子 window。

從磁盤讀取文件,分析它並向我的表單添加面板、控件,因此決定我的表單是否必須是 jDesktopPanel 中的子項作為 JInternalFrame 或只是沒有依賴關系的 JFrame。

我以為 Java 很強大……但我想這是不可能的。

您的孩子 object 有兩個“frm”屬性。 您在自己的定義中添加的 JInternalFrame frm 以及它從其父親繼承的 Frame frm。

由於 form_to_create 中的多態性,您正在從未初始化的超類而不是 JInternalFrame 訪問 frm。

一種解決方案是將行為封裝在方法中。

public class Form {
    JFrame frm;

    public void init(String title){
        frm = new JFrame(title);
    }

    public void doSomething(){
        frm.doSomething();
    }
}

public class Form_child{
    JInternalFrame frm;

    public void init(String title){
        frm = new JInternalFrame(title);
    }

    public void doSomething(){
        frm.doSomething();
    }
}

你的 form_to_create 現在看起來像這樣:

public static void form_to_create(String title, Boolean mdi_child){
        Form frm;
        if (mdi_child) {
            frm = new Form_child();
        }else{
            frm = new Form();
        }

        frm.init(title);
        frm.doSomething();
    }

通過這種方式,您僅通過 doSomething() 方法公開行為,並且程序的 rest 不關心 JFrame 還是 JInternalFrame 是后面的。

更好的是,創建一個定義通用行為的接口並讓兩個表單類都實現它。 這樣 Form_child 不會繼承它不使用的 JFrame 屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM