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();
将返回“嗨”
如果将父方法声明为avirtual
,则必须在子类中重写它,或者将其设置为新的(默认设置)。
如果您覆盖它,上述代码将返回“Hi from DEVIDED”。
如果将其设置为新的,则与它不是虚拟的一样。这称为隐藏。请阅读MSDN在-上的文章,他已经知道了,他在问为什么它不会产生编译器error@TomKnapen,它会导致编译器警告。没有必要导致错误。此说明完全描述了问题。OP没有提到看到过警告。@Darin Dimitrov,谢谢你的回答,但我不明白重写一个方法有什么好处?若我重写父类的方法,那个么若我做了我正在做的事情,那个么父类的方法就会消失。请guide@haansi,当您隐藏基方法时,多态性将不再应用,并且将调用的是基方法而不是派生方法。我已经更新了我的答案,为您提供了两个这样的例子,以便您能够更好地理解其中的差异。lvanov谢谢,您能告诉我在方法重写和执行我所做的操作方面会有什么不同吗?我得到的是,在这两方面,父类方法都将消失?非常确定您会得到警告。