【问题标题】:How to save different classes extended from an abstract class如何保存从抽象类扩展的不同类
【发布时间】:2015-10-11 04:32:03
【问题描述】:

我有一个包含许多 DisplayField 的应用程序(在画布上呈现),例如文本、布尔值、日期等。这些显示字段有许多共同的变量,例如颜色、阴影参数、填充等。

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

从这个抽象类中,我扩展了 DisplayFieldText、DisplayFieldBoolean 等。每一个都是一个单独的类,带有特定于字段功能的附加变量。

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

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

【问题讨论】:

  • 标题不是关键字/标签的地方。标题应该以其他开发人员在实际检查问题之前可以了解问题的方式标记您的问题。您的标题非常模糊,我建议对其进行编辑以吸引了解确切问题的用户。我还建议使用更具体的标签,例如design,以确保您的问题出现在使用这些特定标签查看问题的人面前
  • 标题已更改
  • 设计方面is DisplayFieldText a BasicField?对我来说,这听起来像是一种行为,应该是另一个对象的责任。听起来好像你应该有某种DisplayField 类(具有显示行为),它接受BasicField 类型。您当前的设计似乎违反了Single Responsibility Principle,您应该考虑到这一点重新设计。
  • 对不起,如果我在这里添加了太多细节让人们感到困惑。问题是:有一个抽象类。从这个类扩展了许多其他类。抽象类具有所有扩展类共有的变量。扩展类有自己的私有变量。需要为每个扩展类保存所有变量,即抽象类变量以及扩展类变量。希望能澄清一点。
  • 我(认为)理解了这个问题。您可以让抽象类实现Serializable,然后通过ObjectOutputStream 将对象(即实现Serializable 的类的子类型)保存到您的驱动器。我是在通知您,您的设计违反了设计原则,这些原则是为了强制执行可扩展设计(以及使代码更易于管理),因此我发表评论但没有给出答案。我并不是要回答这个问题,而是要引导您做出更好的设计。

标签: java abstract-class


【解决方案1】:

警告:我不确定您将如何将数据保存到磁盘,因此这可能不适用。

我将假设您当前正在使用如下结构保存到磁盘:

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
    }
}

【讨论】:

  • 这是一个很好的答案。这是我缺少的 super.saveData() 位,现在它很有意义。非常感谢!
猜你喜欢
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多