我開始學習基於MVC的應用程序,因爲我正在進入一些更重的JavaScript工作,並且越來越難以通過意大利麪代碼來更新事物。我正在閱讀關於MVC模式的章節O'Reilly's Essential Actionscript 2.0,因爲我聽說它的內容非常豐富。下面是我的一個簡單問題:MVC視圖和抽象視圖 - 爲什麼這兩個?
在書中,他們使用View接口和一個名爲AbstractView的具體類來設置視圖。 AbstractView類實際上實現了View接口中的函數以及一些輔助函數,但是您仍然必須創建自己的自定義視圖類,以使用其他邏輯來執行任何有用的操作。
那麼,創建一個View接口的目的是什麼?它的唯一目的是在AbstractView對象被實例化時使用。他們繼續說,要真正爲應用程序創建可用的視圖,您需要創建擴展AbstractView類的自定義類。這不會使View/AbstractView繼承不必要嗎?
不應該只有一個抽象類View,它實現了基本功能(如AbstractView那樣),然後創建從View繼承的自定義視圖?如果您絕不會繞過AbstractView類僅從View繼承,那麼我不會看到具有AbstractView類的View界面背後的推理。
我缺少什麼好處?
編輯:這是他們所使用的(動作腳本)的示例代碼:
// -------------- View Class --------------
interface mvc.View {
// Sets the model this view is observing.
public function setModel (m:Observable):Void;
// Returns the model this view is observing.
public function getModel ():Observable;
// Sets the controller for this view.
public function setController (c:Controller):Void;
// Returns this view's controller.
public function getController ():Controller;
// Returns the default controller for this view.
public function defaultController (model:Observable):Controller;
}
// -------------- AbstractView Class --------------
class mvc.AbstractView implements Observer, View {
private var model:Observable; // A reference to the model.
private var controller:Controller; // A reference to the controller.
public function AbstractView (m:Observable, c:Controller) {
setModel(m);
if (c !== undefined) {
setController(c);
}
}
// Returns the default controller for this view.
public function defaultController (model:Observable):Controller {
return null;
}
// Sets the model this view is observing.
public function setModel (m:Observable):Void {
model = m;
}
// Returns the model this view is observing.
public function getModel ():Observable {
return model;
}
// Sets the controller for this view.
public function setController (c:Controller):Void {
controller = c;
// Tell the controller this object is its view.
getController().setView(this);
}
// Returns this view's controller.
public function getController ():Controller {
if (controller === undefined) {
setController(defaultController(getModel()));
}
return controller;
}
public function update(o:Observable, infoObj:Object):Void {
}
}
「一個抽象的View類和一個名爲AbstractView的具體類」 - 我想你的意思是相反的! :) – bfavaretto
這可能是我混淆的一部分 - 在本書中,View類絕對是抽象的,而AbstractView類*實現了View的函數存根。 – Xenethyl
再次看看他們的示例後,他們實際上是將View作爲接口實現,而不是抽象類。我很抱歉在那裏發生混亂。我想這更像是一個關於爲什麼要設置接口 - >具體類 - >具體類繼承鏈的問題。 – Xenethyl