2014-01-24 4 views
0

У меня здесь небольшая проблема с моим мозгом.Интерфейс, базовый класс или что?

Скажите, что у меня есть страница отчета, которая может содержать либо график, либо данные типа datatable. Но страница имеет несколько общих компонентов, например заголовок, номер страницы, общую информацию отчета и т. Д.

В настоящее время я создал класс PageBase с общими полями данных, и у меня есть класс PageGraph и класс PageTable, которые наследуются от базового класса. (Я также создал интерфейс Ipage, но VS/R # говорит мне, что это излишним, поскольку все поля включены в базовый-класс)

Мой код выглядит примерно так:

var data = new List<IPage>(); 
pageItems.Where().OrderBy().ForEach(pageData => { 
    var page = pageData.PageType == 0 ? new PageGraph() : new PageTable(); // <- this one errs out. 
    page.header = pageData.header; 
    page.pageNumber = someCounter; 
    page.otherMetaData = pageData.otherMetaData; 
    if (pageData.PageType == PageTypes.Graph) { 
    // Fill graph fields etc. 
    ... 

Как я могу создать экземпляр правильного класса на основе переменной pageData.PageType?

Язык C#.

+0

Что вы заполняете 'PageXxx'? В чем разница между инициализацией двух типов страниц? Для чего у вас эти классы? И т.д. Рассмотрите возможность создания графика/таблицы отдельного объекта и ссылки на него из объекта страницы. Наследование менее полезно, чем кажется. –

+0

Я получаю «Нет никакого неявного преобразования между PageTable и PageGraph» –

ответ

2

если

var page = pageData.PageType == 0 ? new PageGraph() : new PageTable(); 

является erroring из его problably, потому что компилятор не может определить, какой класс страница должна быть. Если PageGraph и PageTable оба наследуются от PageBase, то, возможно, это должно сработать.

PageBase page = pageData.PageType == 0 ? (PageBase)(new PageGraph()) : (PageBase)(new PageTable()); 

когда у вас есть базовый класс, вы можете сильно брось в тех местах, вам нужно в предположении, что

if (pageData.PageType == PageTypes.Graph) { 
    // Fill graph fields etc. 

где вам нужны специфические свойства класса, то вы могли бы сделать

if (pageData.PageType == PageTypes.Graph) { 
    // Fill graph fields etc. 
    var stonglyCastPage = (PageGraph)page; 
    ... 

например

+0

Я получаю «Нет никакого неявного преобразования между PageTable и PageGraph» на обоих из них. –

+0

Кастинг исправляет ошибки при создании экземпляров. Но я до сих пор не могу получить доступ к специфическим свойствам PageGraph или PageTable. (Объект '' '' 'страница все еще PageBase) –

+0

я обновил ответ –

0

Ответ от Warrenn enslin не работает. Используйте следующее:

PageBase page = pageData.PageType == 0 ? (PageBase)new PageGraph() : new PageTable(); 
+0

Уорренн был на несколько секунд быстрее с его редактированием! – toATwork

+0

Извините, только увидели это после того, как я опубликовал –

+1

Пока христианин получает ответ! – toATwork

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