Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 父类和子类中是否有相同的方法名?_C#_.net - Fatal编程技术网

C# 父类和子类中是否有相同的方法名?

C# 父类和子类中是否有相同的方法名?,c#,.net,C#,.net,可能重复: 我有一个家长和一个孩子班。两者都有一个同名的方法,并且编译器允许它。我不明白。若父类有同名的methode,为什么编译器并没有在子类中显示错误。我没有使用新的虚拟或重写方法。请帮助我理解为什么编译器并没有在子类中显示错误 class BaseClass { public string SayHi() { return ("Hi"); } } class DerivedClass : BaseClass { public

可能重复:

我有一个家长和一个孩子班。两者都有一个同名的方法,并且编译器允许它。我不明白。若父类有同名的methode,为什么编译器并没有在子类中显示错误。我没有使用新的虚拟或重写方法。请帮助我理解为什么编译器并没有在子类中显示错误

 class BaseClass
{

     public string SayHi()
    {

        return ("Hi");

    }

}

class DerivedClass : BaseClass
{

    public  string SayHi()
    {

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

    }

}

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

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

class DerivedClass : BaseClass
{
    public override 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"
    }
}
如果基方法未声明为虚拟,则实际上会收到一条编译器警告,告诉您正在尝试隐藏此基方法。如果这是您的意图,您需要使用
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 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"
    }
}

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

BaseClass o = new DerivedClass();
o. SayHi();
将返回“嗨”

如果将父方法声明为a
virtual
,则必须在子类中重写它,或者将其设置为新的(默认设置)。 如果您覆盖它,上述代码将返回“Hi from DEVIDED”。
如果将其设置为新的,则与它不是虚拟的一样。

这称为隐藏。请阅读MSDN在-

上的文章,他已经知道了,他在问为什么它不会产生编译器error@TomKnapen,它会导致编译器警告。没有必要导致错误。此说明完全描述了问题。OP没有提到看到过警告。@Darin Dimitrov,谢谢你的回答,但我不明白重写一个方法有什么好处?若我重写父类的方法,那个么若我做了我正在做的事情,那个么父类的方法就会消失。请guide@haansi,当您隐藏基方法时,多态性将不再应用,并且将调用的是基方法而不是派生方法。我已经更新了我的答案,为您提供了两个这样的例子,以便您能够更好地理解其中的差异。lvanov谢谢,您能告诉我在方法重写和执行我所做的操作方面会有什么不同吗?我得到的是,在这两方面,父类方法都将消失?非常确定您会得到警告。