2016-01-21 67 views
1

我想了解MVC應用程序內的繼承,我有幾件事情,如果有人可以請幫忙,我想澄清一下。ASP.NET MVC中的繼承和BASE類

問題1

如果我有以下三類它繼承交相輝映這裏如下

Public class StandardPage 

Public class ArticlePage : StandardPage 

Public class NewsPage : ArticlePage 

是在StandardPage班上唯一的基類或者是ArticlePage類也被稱爲作爲BASE類,因爲NewsPage類是從它派生的?

在堅果外殼是派生自其他類也稱爲BASE類的類(對於繼承它的類)?

問題2

如果我在強類型視圖文件(帶有剃刀)工作時定義的上述類別,如果我編寫以下代碼

@foreach (var article in Model.Articles) 
{ 
if (article is StandardPage) 
     { 
var articlePage = article as StandardPage; 

如果內的對象文章var的類型爲StandardPage,ArticlePage或新聞頁面,那麼文章頁面var將被填充而沒有任何問題,因爲StandardPage是BASE類,其中NewsPage同時也是繼承,但是如果我將代碼更改爲以下代碼

@foreach (var article in Model.Articles) 
{ 
if (article is StandardPage) 
     { 
var articlePage = article as ArticlePage; 

當文章VAR裏面的對象類型StandardPage試圖填充articlePage變種,因爲StandardPage不從ArticlePage繼承(到時我會收到「對象引用不設置到對象的實例」的這是相反的方式),因此我無法將某種類型的StandardPage轉換爲ArticlePage。

手指IM越過近那裏瞭解這一點,但如果沒譜IM方式可能有人請點我朝着正確的方向在前進

感謝

+1

我認爲如果你正在循環你的文章並將它們投射到你的視圖中,那麼你可能做錯了什麼。 – Paddy

+0

是的,但讓我說我支持一個應用程序,這是它如何被寫入,是我對視圖內繼承的理解是正確的?我提出這些問題的關鍵是瞭解繼承是如何工作的。我明白,MVC是爲了提供一種方法來分隔內部視圖等邏輯。感謝您的迴應 – Paul

+0

@HenkHolterman - 我想你可能有錯誤 - 鑑於代碼,NewsPage是一篇文章。 – Paddy

回答

1

我認爲基類的概念是相對的,一類是用於從它繼承,所以在你的例子StandardPage類基類爲ArtcilePage和ArticlePage基類也是一個基類NewsPage。如果你說只有一個基類,那麼唯一的基類應該是Object,因爲所有的類都是從鏈中繼承的。

對於第二點,你不能投基類的實例到一個子類,但你可以投一個子類的基類,在你的榜樣:
NewsPage可以轉換爲ArticlePage和StandardPage和對象太
AriclePage可以轉換爲StandardPage和對象
StandardPage可以轉換爲對象只

var news = new NewsPage(); 
var article = new ArticlePage(); 
var standard = new StandardPage(); 

news as ArticlePage // works 
news as StandardPage // works 
news as object // works 

article as StandardPage // works 
article as object // works 
article as NewsPage // won't work 

standard as object // works 
standard as AriclePages // won't work 
standard as NewsPage // won't work 

如果你能投的基類的子類,那麼你就可以施放任何類的任何其他類別,因爲你可以施放任何職業(讓我們假設A)以對象的形式對象作爲所有類的基類,然後將對象投向B,即使A和B在它們之間沒有關係。

+0

嗨IYZ,這正是我的想法,因此我提出了這個問題的原因。 @paddy已經提到'說明ArticlePage是一個'基類'不是太有幫助',並且建議我應該使用術語'是'而不是。所以...考慮到這一點,要確認說明ArticlePage是NewsPage的基類是正確的,但我不應該用這種方式來引用它,而應該使用術語'是' 再一次真的對我的第二點有幫助的答案;)。我認爲我在這裏說得對。 – Paul

1

你說什麼是非常正確的,但是你試圖使用的術語有點混亂。

指出ArticlePage是一個'基類'不是太有幫助,它只是一個類,它可能更有用的陳述NewsPage'是'ArticlePage(和'也是'StandardPage)。

如果您在視圖中投射,您可能在建立模型時出錯。通常,對於像上面那樣的繼承,您可以將'StandardPage'對象的列表傳遞給您的視圖,在這裏它們都可以被視爲相同以進行顯示,但是如果您不得不在視圖中投射,則可能需要重新 - 檢查你的架構,看看你是否真的從你現有的東西中獲益。

舉例來說,如果你有以下結構:

Public class StandardPage { 
    public virtual string Title() { return "A standard page"; } 
} 

Public class ArticlePage : StandardPage { 
    public override string Title() { return "An article page"; } 
} 

Public class NewsPage : ArticlePage { 
    public override string Title() { return "A news page"; } 
} 

而且你的觀點看起來是這樣,那麼這可能是有意義的(無鑄造參與並可以很容易地添加新的「StandardPage」類型,而無需更改的前端):

@foreach (var article in Model.Articles) 
{ 
    <h2>@article.Title()</h2> 
} 
+0

好酷,所以我需要改進我關於BASE類的術語,而是使用'是'。然而,這裏真正的BASE類是StandardPage的權利嗎?其他鏈條下面的所有其他部分都使用'是'關係。 – Paul

+0

這就是這個例子,這是很有道理的;) – Paul