2011-09-09 19 views
1

我開始學習基於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 { 
    } 
} 
+0

「一個抽象的View類和一個名爲AbstractView的具體類」 - 我想你的意思是相反的! :) – bfavaretto

+0

這可能是我混淆的一部分 - 在本書中,View類絕對是抽象的,而AbstractView類*實現了View的函數存根。 – Xenethyl

+0

再次看看他們的示例後,他們實際上是將View作爲接口實現,而不是抽象類。我很抱歉在那裏發生混亂。我想這更像是一個關於爲什麼要設置接口 - >具體類 - >具體類繼承鏈的問題。 – Xenethyl

回答

1

雖然我可能不符合命名規則一致,在實踐中有一定道理,在第一級別你的定義需要實施的界面。在沒有給它任何功能的情況下,它可以以任何你想要的方式實現,沒有任何假設。在O'Reilly所稱的派生類'AbstractView'中(按照您的描述)可能會以合理的方式實現最常見的功能,但爲專業化留下了空間。一些工具包通常會更進一步,然後爲您提供一個簡單的全功能實現該類的問題。

編輯

看例子Xenthyl,我看到了另一個原因分離後,AbstractView只是視圖它也是一個Observer。因此,將基本實現與接口分開的另一個原因是保留了另一個接口實現。

一般來說,他們似乎在做的是定義可以組成更高階類的抽象接口。但接口上沒有

  • 污染的實現,從功能性的前提
  • 另一個接口

這樣的View接口,而不必是一個Observer和副使用反之亦然。

另外從語言的角度來看,'視圖'在Actionscript中聲明'接口'它不能實現任何功能,它只能包含定義,see adobe docs。其他語言如C++沒有關鍵字interface,因此會觸發不同的方法。開發時,除非你採用非常嚴格的方法,否則你可能不會走這條路線,除非你多次開發一個庫,只有一個類會實現某個接口,否則你甚至可能沒有抽象的界面,因爲它顯示在這裏,但只是具體的類。最終當你需要第二個或第三個相同類型的對象的實現時,你可能會提取一個接口,你可能會混合一些實現,或不。但他們試圖向你展示良好的做法,以便他們可能爲了演示目的而過度工作。

這是否更有意義?

+0

謝謝。有什麼理由爲什麼O'Reilly使用這種方法比將View和AbstractView合併到一個單獨的抽象類中更合適,而這個抽象類是用自定義類繼承的?如果有人想繞過AbstractView類並引用View接口來獲得所需的最小值,那麼這個設置實際上是非常有用的,對嗎?但是,在這種情況下,您實際上仍然需要實現View中概述的內容,使用AbstractView中的基本內容。這對我來說似乎很重要。 – Xenethyl

+0

從來沒有使用ActionScript之前,我沒有意識到該語言實際上不支持抽象類。所以,您關於從多個界面構建高階類的觀點在這裏非常有意義。我認爲你也可以說,一種不同的語言(即支持抽象類的語言)會以不同的方式處理。最終,我認爲他們的命名約定與AbstractView被用於不太抽象的東西是什麼讓我失望。非常感謝哈拉爾清理事情! – Xenethyl