父类和子类中的方法名称相同?

haa*_*nsi 2 .net c#

可能重复:
为什么我们需要new关键字,为什么默认行为要隐藏而不是覆盖?

我有一个父母和一个孩子班.两者都有一个具有相同名称的方法,编译器允许它.我无法理解.如果父类具有相同名称的方法,为什么编译器未在子类中显示错误.我没有使用新的虚拟或覆盖方法.请帮助我理解为什么编译器没有在子类中显示错误?

 class BaseClass
{

     public string SayHi()
    {

        return ("Hi");

    }

}

class DerivedClass : BaseClass
{

    public  string SayHi()
    {

        return (base.SayHi() + " from derived");

    }

}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 9

必须声明的基本方法,virtual如果你想override它的子类:

class BaseClass
{
    public virtual string SayHi()
    {
        return ("Hi");
    }
}

class DerivedClass : BaseClass
{
    public override string SayHi()
    {
        return (base.SayHi() + " from derived");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果基本方法未声明为虚拟,您实际上会收到编译器警告,告诉您正在尝试隐藏此基本方法.如果这是您的意图,您需要使用new关键字:

class BaseClass
{
    public string SayHi()
    {
        return ("Hi");
    }
}

class DerivedClass : BaseClass
{
    public new string SayHi()
    {
        return (base.SayHi() + " from derived");
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

为了更好地看到两者之间的区别,请看下面的例子.

第一个使用在子类中重写的基本虚方法:

class BaseClass
{
    public virtual string SayHi()
    {
        return ("Hi");
    }
}

class DerivedClass : BaseClass
{
    public override string SayHi()
    {
        return (base.SayHi() + " from derived");
    }
}

class Program
{
    static void Main()
    {
        BaseClass d = new DerivedClass();
        // the child SayHi method is invoked
        Console.WriteLine(d.SayHi()); // prints "Hi from derived"
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个隐藏基本方法:

class BaseClass
{
    public string SayHi()
    {
        return ("Hi");
    }
}

class DerivedClass : BaseClass
{
    public new string SayHi()
    {
        return (base.SayHi() + " from derived");
    }
}

class Program
{
    static void Main()
    {
        BaseClass d = new DerivedClass();
        // the base SayHi method is invoked => no polymorphism
        Console.WriteLine(d.SayHi()); // prints "Hi"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个解释完整地描述了问题。OP 没有提及看到该警告。 (2认同)