gpt4 book ai didi

c# - 不使用方法隐藏,为什么不调用父方法?

转载 作者:太空狗 更新时间:2023-10-29 22:04:45 25 4
gpt4 key购买 nike

考虑这段代码:

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");
}
}

在上面的代码中我们没有使用方法隐藏。

当创建学生实例并调用 showinfo 方法时,我的输出是 I am Student 我不使用 new 关键字。

为什么不使用方法隐藏却不调用父方法?

最佳答案

无论您是否使用 new 关键字,基本方法都不是虚拟的。所以它总是将被调用的派生方法。唯一的区别是编译器会向您发出警告,因为基本方法是隐藏的并且您没有显式使用 new 关键字:

'Student.ShowInfo()' hides inherited member 'Person.ShowInfo()'. Use the new keyword if hiding was intended.

C# 编译器发出此消息是为了警告您,您可能在没有意识到的情况下错误地这样做了。

如果此隐藏是有意的,为了修复警告,您应该使用 new 关键字:

public new void ShowInfo()
{
Console.WriteLine("I am Student");
}

如果不是,你应该使基方法成为虚拟的:

public class Person
{
public virtual void ShowInfo()
{
Console.WriteLine("I am person");
}
}

然后在派生类中覆盖它:

public class Student : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am Student");
}
}

显然,在这两种情况下,如果需要,您都可以调用基本方法:

public override void ShowInfo()
{
base.ShowInfo();
Console.WriteLine("I am Student");
}

关于c# - 不使用方法隐藏,为什么不调用父方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17897963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com