我试图解决一个具体的问题,事实上,这是一个更普遍的问题的例子。假设我们有几个对象,其中一个对象依赖于另一个对象:
Bitmap AnImage; // Several instances of this object are possible: an image is loaded; then is discarded; then a new image is loaded, and so on.
Public class PixelSelection
{
string GenericAttribute;
int X;
int Y;
public PixelSelection(string myAttribute, int x, int y)
{
GenericAttribute = myAttribute;
X = x;
Y = y;
}
}
第二个对象:
- 以这种方式创建: new PixelSelection("Whatever", AnImage.Width, AnImage.height) 所以它取决于 AnImage 对象;
- 它公开了主应用程序可以订阅的事件。
每个类只需要一个实例,并且两个对象都是由用户按需创建的:如果没有 Bitmap 实例,您不能使用 PixelSelection,但是当用户需要与 PixelSelection 对象交互时,就会出现对实例的需求。
我正在处理的问题是如何使 PixelSelection 与位图保持同步;这些是我正在考虑的可能情况:
- 将 PixelSelection 声明为主窗体的属性,然后在每次创建新位图时实例化它。这每次都需要新的事件注册,并且使代码容易出错,因为每次需要创建新的位图时,开发人员都需要记住在不同的代码部分中实例化一个新的 PixelSelection 对象。
- 在开始时实例化 PixelSelection 对象,对所有 Bitmap 实例使用相同的对象,仅在代码中真正使用它的地方更新其属性 X 和 Y。这需要一个没有 x 和 y 参数的新构造函数,因为没有可用的位图和代码来管理在没有正确初始化的情况下尝试对实例执行操作时 PixelSelection 使用中的不一致性。
- 使用具有 Bitmap 和 PixelSelection 对象作为属性的包装器对象,仅用于在分配 Bitmap 时强制正确创建或更新 PixelSelection 对象。这对我来说听起来很不自然(或肮脏),因为这个包装器不适合解决方案域模型,它只是解决非常具体问题的一种解决方法。
- 创建一个从具有 PixelSelection 作为属性的 Bitmap 派生的类,以显而易见的方式管理其生命周期。这可能会导致超胖的类被一堆对象填充,这些对象不是为了建模,而只是为了解决对象生命周期的需求和使用模式。
我草拟的四个暂定场景在抽象上非常不同,并尝试使用不同的工具集;更糟糕的是,我觉得他们可以证明我对 OO 模型的理解不足,显示出对对象生命周期问题和面向对象建模的困惑。请有人帮我确定解决问题的最佳方法是什么,以及为什么就最佳实践而言,该解决方案是正确的答案?谢谢。