接口,基类还是什么?

时间:2014-01-24 09:38:38

标签: c# oop inheritance

我的脑部有轻微的功能障碍。

假设我有一个可以包含图表或数据表的报表页面。但该页面有几个共同的组件,如标题,页码,通用报告信息等。

现在我已经使用公共数据字段创建了一个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#。

2 个答案:

答案 0 :(得分:2)

如果

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

错误地说错了,因为他们的编译器无法确定需要哪个类页面。如果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;
    ...  

例如

答案 1 :(得分:0)

Warrenn enslin的答案不起作用。使用以下内容:

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