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

时间:2013-07-27 12:46:57

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

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

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

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

8 个答案:

答案 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