当我们不使用方法隐藏时,为什么不调用父方法?

Yaz*_*ati 5 c# method-hiding

考虑以下代码:

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)