C#运行铸造方法而不是实际方法

时间:2015-08-07 01:07:08

标签: c# class methods override

我有一些ViewComponents扩展单个ViewComponent类。在我的视图中,我将它循环到ViewComponents并打印它们。不幸的是,它正在拉动转换方法而不是实际的类方法。例如:

using System;

namespace test
{
  class Component {
    public string getType() {
      return "Component";
    }
  }

  class ButtonComponent: Component {
    public string getType() {
      return "Button";
    }
  }

  public class test
  {
    public static void Main() {
      Component[] components = new Component[1];
      components [0] = new ButtonComponent();

      Console.WriteLine(components[0].getType()); // prints Component
    }
  }
}

如何让按钮打印“按钮”而不是“组件”?

2 个答案:

答案 0 :(得分:3)

您正在定义两个单独的实例方法Component.getType()ButtonComponent.getType()。你很可能也有一个关于这个问题的编译器警告,#34;方法ButtonComponent.getType()隐藏了基类的方法。如果是这样,请使用new关键字。"此警告可让您了解您遇到的行为,并且还有page about it in the documentation

您想要做的是在基类上声明virtual方法,在子类中声明override

class Component {
    public virtual string getType() {
      return "Component";
    }
}

class ButtonComponent: Component {
    public override string getType() {
      return "Button";
    }
}

这样ButtonComponent.getType() 的实现取代基类型。

附注:通常,方法名称的公认约定是PascalCase(不是camelCase)。考虑使用大写字母G重命名方法GetType()

答案 1 :(得分:1)

使用虚拟和覆盖关键字:

class Component {
    public virtual string getType() {
       return "Component";
    }
}

class ButtonComponent: Component {
    public override string getType() {
        return "Button";
    }
}

:)