将模型传递给Stage实例的View构造函数

时间:2013-04-24 12:14:14

标签: actionscript-3 flash model-view-controller flash-cs5

我正在寻找一种优雅的解决方案,为一个舞台实例的View设置Model参数。

My View构造函数如下所示:

public function View($model:Model, $controller:IController=null){ ... }

我的子类构造函数:

public function ViewSubClass($model:Model, $controller:IController=null){ ... }

我的想法是,子类将是一个UI元素,我宁愿只是在舞台上而不必手动定位它。我已经抛弃了将占位符元素移除并使用它们的位置来附加真实UI元素的可能性,但它对我来说似乎有些晦涩。

我想我总是可以将View中$ model参数的默认值设置为null,但并非所有视图都是阶段实例,所以我也不想这样做。

任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:1)

Flash无法填充构造函数参数。这就是我always suggest避免View的构造函数参数的原因。如果这是你自己的类,我建议继续修复父类,这样就不需要了。

如果不是,您可以使用

public function VewSubClass() {
   super(null, null);
}

我会担心你实际上需要模型和控制器,所以我会在View子类上创建setter,然后在instance arrives on stage之后填充这些变量。

public function set model(value:Model):void {
    _model = value;
    //do whatever the super constructor did based on receiving the model
}
public function set controller(value:IController):void {
   _controller = value;
   //etc.
}

请注意,View可能不需要了解控制器,我也不建议将整个模型提供给View - 只需要几个属性它需要。因此,如果Class 你的,那么你就可以更好地纠正这些(IMO)架构问题。

根据您提供的签名,我不会在所有惊讶地发现模型和控制器内部存储是私有的,而不是受保护的,这意味着你几乎无论如何都要面对重写(假设View上需要模型和控制器)。

答案 1 :(得分:0)

我通过将ViewSubClass构造函数更改为:

来解决了这个问题
public function ViewSubClass ($model:Model=null, $controller:IController=null){ ... }

不确定为什么我认为构造函数必须匹配超类'构造函数完美。如果有的话,我仍然愿意接受更优雅的解决方案。谢谢你的期待。

-Veo