考虑以下代码:
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
关键字。
为什么在不使用方法隐藏时不调用父方法?
答案 0 :(得分:13)
无论您是否使用new
关键字,基本方法都不是虚拟的。所以它总是被调用的派生方法。唯一的区别是编译器会向您发出警告,因为基本方法是隐藏的,并且您没有明确使用new
关键字:
' Student.ShowInfo()'隐藏继承的成员' Person.ShowInfo()'。如果想要隐藏,请使用new关键字。
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");
}
答案 1 :(得分:3)
实际上,从程序逻辑的角度来看, new修饰符根本没有任何效果。
新修饰符的唯一效果是记录您的意图,以便:
编译器可以在适当时警告您(例如在不隐藏继承成员的声明中使用new修饰符 - 或者相反,当不使用new修饰符时,即使声明隐藏了继承的会员)
其他开发人员更容易理解您的代码
隐藏/不隐藏真正重要的是您是否使用override modifier(只有在继承的成员为虚拟时才能使用)。如果不使用override修饰符,则始终隐藏继承的成员。在您的示例中,您不使用覆盖修饰符,因此执行隐藏继承的成员。
注意:请勿混淆'new modifier' with the 'new operator' or the 'new constraint'
答案 2 :(得分:2)
它使用方法隐藏,它只是隐式使用。 new
关键字应该用于显式地显示您知道您正在隐藏该方法,但是,您的代码仍将编译并隐藏该方法。虽然这绝对不推荐。
答案 3 :(得分:1)
Student.ShowInfo()
隐藏了继承的成员Person.ShowInfo()
您最好检查编译器警告
'ConsoleApplication5.Program.Student.ShowInfo()'隐藏继承 成员'ConsoleApplication5.Program.Person.ShowInfo()'。使用新的 如果隐藏是关键字的关键字。
答案 4 :(得分:1)
使用相同的方法签名ShowInfo
意味着您将隐藏父类方法。 new
关键字不是必需,它只是让开发人员知道当前方法隐藏了父类中的另一个方法。
答案 5 :(得分:1)
它隐藏了这就是为什么你会收到警告说如果你故意隐藏它,你应该使用new
关键字。查看C# Language Spec 3.7.1.2
的<{1}}部分。
通过继承隐藏名称时会发生类或结构 重新声明从基类继承的名称。 这种类型的名称隐藏采用以下形式之一:
•甲 在类或类中引入的常量,字段,属性,事件或类型 struct隐藏具有相同名称的所有基类成员。
•一种方法 在类或结构中引入隐藏所有非方法基类 具有相同名称的成员,以及具有相同名称的所有基类方法 签名(方法名称和参数计数,修饰符和类型)。
•类或结构中引入的索引器隐藏所有基类 具有相同签名的索引器(参数计数和类型)。
答案 6 :(得分:1)
原因是,重新声明基类类方法时会隐藏它们。它被称为hiding through inheritance。
答案 7 :(得分:1)
正如其他人所说[{1}}您是否使用了method hiding is implicit
关键字。你可以查看这段代码 -
new
当您 private static void Main(string[] args)
{
Person student = new Student();
student.ShowInfo(); //output --> "I am person"
}
时,instantiate base class object with derived class
。