java - 确保对某种类型的所有已声明和继承的成员调用方法

标签 java inheritance abstract-class composition

我想为标题道歉,但我不知道如何总结这个问题。


我有以下名为 AbstractWriter 的类:

public class AbstractWriter {

    private boolean changePerformed = false;

    // Some Setters

    private void changePerformed() {
        if (!changePerformed)
            changePerformed = true;
    }

    public boolean isChangePerformed() {
        return changePerformed;
    }

    protected <S> void setValue(
        Class<S> type, Object oldValue, Object newValue, Setter setter) {
        // Do something
        changePerformed();
    }
}

每当调用 setter 时,方法 setValue(…) 都会被调用。所有 setter 都执行此规则。

然后是 AgeWriter,从 AbstractWriter 扩展而来:

public class AgeWriter extends AbstractWriter {
    // Some Setters
}

还有 HumanWriter:

public class HumanWriter {

    // Some setter calls are delegated to this Writer
    private AgeWriter ageWriter = new AgeWriter();

    // Some Setters

}

当我现在调用 HumanWriter 上的方法 isChangePerformed() 时,我只知道是否调用了 HumanWriter 上的 setter,但不知道如果其中一个委托(delegate) setter 到 AgeWriter

我现在正在寻找解决此问题的通用方法。以下是我尝试过的分别想到的一些方法:

  • 尝试使用反射查找类型为AbstractWriter 的所有成员。但是 getDeclardFields 错过了继承的那些,而 getFields 错过了 private 的。
  • 使 isChangePerformed() 抽象,以便每个实现都必须确保其实现正确。
  • 创建 abstract 方法 getAbstractWriters 返回此类型中使用的所有 AbstractWriter

您有什么想法可以解决这个问题?

最佳答案

如果您将 ageWriter 保持为 HumanWriter 私有(private),则任何外部对象都无法直接调用 AgeWriter 上的 setter。使用封装,不向 ageWriter 提供任何访问器,并在 HumanWriter 上使用委托(delegate)给 ageWriter 的方法。

您还可以使用可观察/观察者模式(JavaBeans 属性更改监听器)并将 HumanWriter 作为监听器添加到 AgeWriter。这样,ageWriter 上的每个属性更改都会触发一个事件,该事件将发送到 HumanWriter。

关于java - 确保对某种类型的所有已声明和继承的成员调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9309927/

相关文章:

swift - 变量 'xxx' 从未发生过突变;在派生类中

抽象基类的 C++ 函数

c# - 一个抽象类继承另一个抽象类的问题

java - 在文本文件中搜索一个词并返回它的频率

c++ - 我怎么知道指向基类对象的指针数组中元素的类型是什么,它将为派生类分配内存

C# "Inheriting"静态方法?

c++ - 使用抽象类实现派生类的元素栈

java - ZXing QR 代码扫描仪嵌入在扫描过程中按下后退按钮

java - 在 Form .java 文件中检索用于国际化的 Spring 外部化字符串

java - 在java中测试文件输入流