考虑以下代码:
internal class Program
{
private static void Main(string[] args)
{
var student = new Student();
student.ShowInfo(); //output --> "I am Student"
}
}
public class Person
{
public void ShowInfo()
{
Console.WriteLine("I am person");
}
}
public class Student : Person
{
public void ShowInfo()
{
Console.WriteLine("I am Student");
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中我们不使用方法隐藏.
当创建学生实例和调用showinfo方法我的输出是I am Student我不使用new关键字.
当我们不使用方法隐藏时,为什么不调用父方法?
Dar*_*rov 13
无论您是否使用new关键字,基本方法都不是虚拟的.所以它总是被调用的派生方法.唯一的区别是编译器会向您发出警告,因为基本方法是隐藏的,并且您没有显式使用new关键字:
'Student.ShowInfo()'隐藏了继承的成员'Person.ShowInfo()'.如果要隐藏,请使用new关键字.
C#编译器发出此信息是为了警告你,如果没有意识到你可能会错误地完成它.
为了修复警告,如果隐藏有意,则应使用new关键字:
public new void ShowInfo()
{
Console.WriteLine("I am Student");
}
Run Code Online (Sandbox Code Playgroud)
如果没有,您应该将基本方法设为虚拟:
public class Person
{
public virtual void ShowInfo()
{
Console.WriteLine("I am person");
}
}
Run Code Online (Sandbox Code Playgroud)
然后在派生类中覆盖它:
public class Student : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am Student");
}
}
Run Code Online (Sandbox Code Playgroud)
显然,在这两种情况下,如果你想要,你可以调用基本方法:
public override void ShowInfo()
{
base.ShowInfo();
Console.WriteLine("I am Student");
}
Run Code Online (Sandbox Code Playgroud)