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

时间:2011-09-24 10:47:07

标签: c# .net

  

可能重复:
  why do we need the new keyword and why is the default behavior to hide and not override?

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

 class BaseClass
{

     public string SayHi()
    {

        return ("Hi");

    }

}

class DerivedClass : BaseClass
{

    public  string SayHi()
    {

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

    }

}

3 个答案:

答案 0 :(得分:9)

如果要在子类中virtual,则必须将基本方法声明为override

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

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

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

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

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

更新:

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

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

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

第二个隐藏基本方法:

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

答案 1 :(得分:0)

由于该方法不是虚拟的,因此具有相同名称没有问题。 调用哪一个仅取决于引用的类型。

BaseClass o = new DerivedClass();
o. SayHi();

将返回“嗨”。

如果您将父方法声明为virtual,那么您必须在子类中override或将其设为new(这是默认值)。 如果您覆盖它,上面的代码将返回“来自派生的Hi”。 如果你使它new与它不是虚拟的那样相同。

答案 2 :(得分:0)

它被称为Name隐藏。请阅读 - Hiding through inheritance

上的MSDN文章