2016-01-21 3 views
1

Я пытаюсь понять наследование в приложении MVC, и у меня есть несколько вещей, которые я хотел бы прояснить, если кто-то может помочь.Наследование и классы BASE в ASP.NET MVC

Вопрос 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 или страницу новостей, тогда varPage var будет заполнен без каких-либо проблем, поскольку StandardPage - это класс BASE, который ArticlePage & NewsPage наследует, однако, если я изменю код на следующие

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

Когда объект внутри статьи вар имеет тип StandardPage я получит «ссылка на объект не указывает на экземпляр объекта» при попытке заполнить articlePage вар, потому что StandardPage не наследует от ArticlePage (это наоборот), и поэтому я не могу использовать что-то типа StandardPage и ArticlePage.

Пальцы скрещены им почти там с пониманием этого, но если им путь от марки может кто-то пожалуйста, мне точку в правильном направлении

Заранее спасибо

+1

Я думаю, что если вы зацикливаете свои статьи и бросаете их в свое мнение, то вы, вероятно, делаете что-то неправильно. – Paddy

+0

Да, но давайте скажем, что я поддерживаю приложение, и вот как оно было написано, мое понимание относительно наследования из правильного представления? Все, что я задаю этим вопросам, - это понять, как работает наследование. Я понимаю, что MVC предназначен для того, чтобы предоставить возможность отделить логику от внутреннего зрения и т. Д. Спасибо за ваш ответ. – Paul

+0

@HenkHolterman - Я думаю, что у вас может быть что-то неправильное - учитывая код, NewsPage является ArticlePage. – Paddy

ответ

1

Я думаю, что понятие базового класса является относительным, класс является базовым классом для классов, наследуемых от него, так что в вашем примере StandardPage является базовым классом для ArtcilePage и ArticlePage также является базовым классом для NewsPage. Если вы говорите, что существует только один базовый класс, то единственным базовым классом должен быть Object, потому что все классы наследуются от него в цепочке.

Для второй точки, вы не можете бросить экземпляр базового класса к подклассу, но вы можете бросить подкласс базового класса, в вашем примере:
NewsPage может быть приведен к ArticlePage и StandardPage и Object слишком
AriclePage может быть приведен к StandardPage и Object
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, но я не должен ссылаться на него таким образом, и я должен использовать терминологию 'is' Снова еще одна действительно полезный ответ для моего второго пункта;). Я думаю, что я нахожусь здесь правильно. – Paul

1

То, что вы заявили в значительной степени правильно, однако номенклатура, которую вы пытаетесь использовать, немного запутанна.

Утверждение, что ArticlePage является «базовым классом», не слишком полезно, это просто класс, возможно, более полезно указать, что NewsPage является «ArticlePage» (и «также является стандартным»).

Если вы выполняете кастинг в своем представлении, вы, возможно, делаете что-то неправильно в своем наращивании своей модели. Как правило, для наследования, как и у вас выше, вы можете передать список объектов «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 и вместо этого использовать «Is a». Тем не менее, истинный класс BASE здесь StandardPage правильно ?, все остальное в цепочке использует отношения «есть». – Paul

+0

Thats для примера, который имеет большой смысл;) – Paul

Смежные вопросы