C#运行铸造法而非实际法

C#运行铸造法而非实际法,c#,class,methods,overriding,C#,Class,Methods,Overriding,我拥有扩展单个ViewComponent类的ViewComponent类型。在我看来,我让它在ViewComponents上循环并打印它们。不幸的是,它拉入的是铸造的方法,而不是实际的类方法。例: using System; namespace test { class Component { public string getType() { return "Component"; } } class ButtonComponent: Compone

我拥有扩展单个ViewComponent类的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
    }
  }
}

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

您正在定义两个独立的实例方法,
Component.getType()
ButtonComponent.getType()
。您很可能也收到了有关此问题的编译器警告,类似于“Method
ButtonComponent.getType()
对基类隐藏方法。如果有意的话,请使用
new
关键字。”此警告让您了解您正在经历的行为,并且还有一个错误

相反,您要做的是在基类上声明一个
virtual
方法,并在子类中重写它:

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

class ButtonComponent: Component {
    public override string getType() {
      return "Button";
    }
}
这样,
ButtonComponent.getType()的实现取代了基类型的实现



旁注:一般来说,方法名的公认约定是PascalCase(而不是camelCase)。考虑将您的方法<代码> GETType()/代码>用Capital G.

< p>您定义了两个单独的实例方法,即代码>组件.GETType()/<代码>和<代码> ButoTypult.GETType()/<代码>。您很可能也收到了有关此问题的编译器警告,类似于“Method
ButtonComponent.getType()
对基类隐藏方法。如果有意的话,请使用
new
关键字。”此警告让您了解您正在经历的行为,并且还有一个错误

相反,您要做的是在基类上声明一个
virtual
方法,并在子类中重写它:

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

class ButtonComponent: Component {
    public override string getType() {
      return "Button";
    }
}
这样,
ButtonComponent.getType()的实现取代了基类型的实现



旁注:一般来说,方法名的公认约定是PascalCase(而不是camelCase)。考虑重命名您的方法<代码> GETType()/<代码>用G.G.

< P>使用虚拟和重写关键字:

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

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

:)

使用虚拟和覆盖关键字:

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

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