C# 实例类型对从派生类调用方法的影响
假设我有以下几点:C# 实例类型对从派生类调用方法的影响,c#,inheritance,instancetype,C#,Inheritance,Instancetype,假设我有以下几点: static void Main(string[] args) { DerivedClass input = new DerivedClass(); input.WriteName(); // Outputs BaseClass } class BaseClass { public void WriteName() { Console.WriteLine(GetName());//this.GetType() }
static void Main(string[] args)
{
DerivedClass input = new DerivedClass();
input.WriteName(); // Outputs BaseClass
}
class BaseClass
{
public void WriteName()
{
Console.WriteLine(GetName());//this.GetType()
}
protected string GetName()
{
return "BaseClass";
}
}
class DerivedClass : BaseClass
{
protected new string GetName()
{
return "DerivedClass";
}
}
我运行了一些关于调用GetName()
方法的对象类型的测试(使用GetType())(我的意思是DerivedClass.GetName
来自WriteName
)。我知道WriteName
无法在DerivedClass
类中看到新方法,并且GetName
方法被new
关键字隐藏,但是实例类型(DerivedClass
)对此没有任何影响吗?
调用
GetName
方法时,类型是否向上转换为基类?从Main方法调用时,派生类中的new关键字隐藏了该方法。GetName似乎提供了预期的结果。派生类中的new关键字隐藏了该方法。但是这是从基类调用的,它总是从基类调用实现。即使下面的代码也会打印“基类”:
那么DerivedClass类型呢?是否有任何到基类的隐式转换来调用该方法?如果要调用派生类方法,则需要将基类方法标记为virtual,将派生方法标记为override。这样,如果对象是派生类型,它将从派生类调用该方法。是的,我知道这一点,但不知道如何在类型仍然是派生类时解析为调用
BaseClass.GetName()
?
public void WriteName()
{
string className = "";
if (this is DerivedClass)
{
className = ((DerivedClass)this).GetName();
}
else
{
className = this.GetName();
}
Console.WriteLine(className);
}