oop - 更改对象时执行方法(OOP)
问题描述
我正在学习 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;
}
}
每次更改变量“object”时,都应调用变量 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 范式本身的一部分。如果这将是一些自动行为,则会导致巨大的开销,因为通常不需要以这种方式观察更改。但是您当然可以根据您的具体要求实施您的方式。
至少有两种方法。
在 MVVM(如 WPF)中有一个INotifyPropertyChanged
接口(我们称之为模式),您可以使用它来自己触发通知,就像您使用SomeClass
. 但是,当您嵌套对象时,您需要将该机制连接起来。级联:您应该对实际实例进行相同操作,OtherClass
并将实际实例连接起来以进行更改。请参阅:https ://rehansaeed.com/tag/design-patterns/
另一种选择是Observable
模式。每次对象更改状态时,您都会发出一个实例 - 当前实例。但是,您应该注意发出不可变对象。至少通过使用使其只读的接口。但是您仍然需要连接对象树以对嵌套对象的更改做出反应。
如果您的平台支持反射,并且您创建了一个适当的工具集,那么您可以使这种连接变得非常简单。但同样:这与范式并不严格相关。
推荐阅读
- linux - 如何快速找到链接时需要存在另一个对象图块的对象文件?
- vim - Vim 无法识别来自 vim-latex 的某些命令
- python - 从 Python 2 转换为 3。使用 cmp 进行排序
- c# - 关于在 C# 中执行 while 循环的问题
- c++ - 如何从棋盘上的框号中查找行和列?
- c# - 必须通过 Modbus TCP 通过 Modbus RTU 为轮询 RS485 编写客户端吗?
- asynchronous - 使用带有颤振地图的期货
- c - 如何检查本身是无符号变量的负数(通过用户输入)?
- php - 如何在 PHPUnit 测试中“模拟”Sentry 客户端
- android - 使用导航组件在父片段范围内共享 ViewModel