更改对象时执行方法(OOP)

问题描述 投票:0回答:1

我正在学习OOP,并尝试编写一个简单的程序,该程序将在每次特定变量更改时执行某种方法。我有两个班级:

public class SomeClass {

  private OtherClass object;

  public OtherClass getObject() {
    return this.object;
  }

  public void setObject(OtherClass object) {
    objectChanged();
    this.object = object;
  }

  private void objectChanged() {
    System.out.println("Object has changed");
  }
}


public class OtherClass {

  private int value = 5;

  public int getValue() {
    return this.value;
  }

  public void setValue(int value) {
    this.value = value;
  }
}

每次更改变量“对象”时,应调用变量objectChanged。我的第一个幼稚想法是将方法调用放在set函数内部。但是,如果在设置对象后更改了对象怎么办?像这样:

SomeClass someObject = new SomeClass();
OtherClass otherObject = new OtherClass();
someObject.setObject(otherObject); //"Object has changed"
otherObject.setValue(10); //nothing happens yet

我需要someObject来实现存储在其内部的对象将其值更改为10,但是我该怎么做?在OOP中甚至可能吗?

oop object variables parameter-passing
1个回答
0
投票

看起来很合理,但是应该考虑很多事情。这就是为什么通常没有自动方法的原因。因此,它不是OOP范式的一部分。如果这是某种自动行为,则将导致巨大的开销,因为通常不需要以这种方式观察更改。但是,当然,您可以根据自己的具体要求来实现自己的方式。

至少有两种方法。

[在MVVM(如WPF)中,有一个INotifyPropertyChanged接口(我们称它为模式),您可以用来触发通知,就像SomeClass一样。但是,当您嵌套对象时,需要连接该机制以进行级联:您应该对OtherClass进行相同的操作,并且还应将实际实例连接起来以冒充更改。请参阅:https://rehansaeed.com/tag/design-patterns/

另一个选项是Observable模式。每次对象更改状态时,都会发出一个实例-当前实例。但是,您应该注意发出不可变的对象。至少通过使用使其成为只读的接口。但是您仍然需要连接对象树以对嵌套对象的更改做出反应。

如果您的平台支持反射,并且您创建了适当的工具集,则可以使这种连接非常简单。再次重申:这与范式并不严格相关。

© www.soinside.com 2019 - 2024. All rights reserved.