C#运行铸造法而非实际法
我拥有扩展单个ViewComponent类的ViewComponent类型。在我看来,我让它在ViewComponents上循环并打印它们。不幸的是,它拉入的是铸造的方法,而不是实际的类方法。例: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
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()
。您很可能也收到了有关此问题的编译器警告,类似于“MethodButtonComponent.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()/<代码>。您很可能也收到了有关此问题的编译器警告,类似于“MethodButtonComponent.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";
}
}
:)