如何保存从抽象类扩展的不同类

时间:2015-10-11 04:32:03

标签: java abstract-class

我有一个带有许多DisplayFields的应用程序(在画布上渲染),例如text,boolean,date等。这些DisplayFields有许多共同的变量,如颜色,阴影参数,填充等。

由于这些常见值,我将BasicField定义为抽象类。

在这个抽象类中,我扩展了DisplayFieldText,DisplayFieldBoolean等。每个都是一个单独的类,其中包含特定于字段函数的其他变量。

现在我需要将所有DisplayField保存到磁盘。因此每个字段都需要保存其核心(抽象类变量)以及它自己的参数。

如何在没有大量重复代码的情况下解决这个问题?

1 个答案:

答案 0 :(得分:0)

警告:我不确定你是如何将数据保存到磁盘的,所以这可能不适用。

我将假设你正在使用一些看起来像这样的结构保存到磁盘:

class DisplayField {
    private int data;

    public void saveData() {
        // save data here
    }
}

这是一种完全可以接受的保存数据的方法,但是当你引入父类时,它会变得很混乱:

abstract class BasicField {
    public String sharedData1;
    public double sharedData2;
}

class DisplayField extends BasicField {
    private int data;

    public void saveData() {
        // save parent's data every time in every subclass!! Not fun!
        // save DisplayField's private data
    }
}

解决此问题的一个好方法是使用多态。由于BasicField的所有子类都需要保存它们的数据,因此可以在BasicField中定义saveData()方法,并在子类中调用它。这有很多其他的好处,例如,如果你有一个BasicField对象,你知道它将能够保存它的数据。此外,如果稍后向BasicField添加更多数据,则只需更改BasicField中的几行代码,而不是修改其所有子类。

abstract class BasicField {
    public String sharedData1;
    public double sharedData2;

    public void saveData() {
        // save sharedData1
        // save sharedData2
    }
}

class DisplayField extends BasicField {
    private int data;

    public void saveData() {
        super.saveData();
        // save DisplayField's private data
    }
}