2016-01-21 69 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