繁体   English   中英

ASP.NET MVC中的继承和BASE类

[英]Inheritance & BASE Classes in ASP.NET MVC

我正在尝试了解MVC应用程序中的继承,如果有人可以帮助,我有两点要澄清。

问题1

如果我有以下三个相互继承的类,如下所示

Public class StandardPage

Public class ArticlePage : StandardPage

Public class NewsPage : ArticlePage

是StandardPage类是这里唯一的BASE类,还是NewsPage类从中派生而将ArticlePage类也称为BASE类?

简而言之,是从其他类派生的类又称为BASE类(对于继承它的类)吗?

问题2

如果在强类型视图文件(使用Razor)中工作时定义了上述类,则编写以下代码

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

如果article var内部的对象的类型为StandardPage,ArticlePage或news page,则将填充articlePage var而不会出现任何问题,因为StandardPage是ArticlePage和NewsPage都继承的BASE类,但是如果我将代码更改为以下内容

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

当文章var中的对象为StandardPage类型时,尝试填充articlePage var时会收到“未将对象引用设置为对象实例”的信息,因为StandardPage不能从ArticlePage继承(相反),并且因此,我无法将StandardPage类型的内容转换为和ArticlePage类型。

手指几乎可以理解我的意思,但是如果我无法做到这一点,请有人指出正确的方向

提前致谢

您所说的基本上是正确的,但是您要使用的术语有点混乱。

指出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>
}

我认为基类的概念是相对的,一个类是从其继承的类的基类,因此在您的示例中StandardPage是ArtcilePage的基类,ArticlePage也是NewsPage的基类。 如果您说只有一个基类,那么唯一的基类应该是Object,因为所有类都从链中继承。

第二点,您不能将基类的实例强制转换为子类,但可以将子类强制转换为基类,例如:
NewsPage也可以转换为ArticlePage,StandardPage和Object
AriclePage可以强制转换为StandardPage和Object
StandardPage只能转换为Object

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之间没有关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM