C#的方法隐藏问题高手来讲一下。。
public class customer{
public string getName(){
return "customer,kaar ";
}
}
class customerA:customer{
public new string getName(){
return "customerA,xiaoxiao ";
}
public static void main(string[] a){
customer c = new customerA();
console.Writeline(c.getName);
}
}
这个题的结果是 :customer,kaar
这个题不是隐藏了基类的getName()方法吗?我感觉应该打印这个customerA,xiaoxiao 才对。
customer c = new customerA(); 这句话不就是JAVA里的上转型吗,正常也应该是打印 customerA,xiaoxiao 才对。
求高手来讲讲
------解决方案--------------------customer c = new customerA();
实体c以customerA初始化为customer;
class customerA:customer{
public new string getName() //这里使用关键字new, return "customerA,xiaoxiao "; //这证明此继承类与基类的getName方法无关,
}
所以调用c.getName().则调用的是
public class customer{
public string getName(){
return "customer,kaar ";
}
}
方法,
------解决方案--------------------using System;
namespace ZZ
{
class ZZConsole
{
[STAThread]
static void Main(string[] args)
{
A a = new A();
a.Show();//你调用了A类的Show方法.
B b = new B();
b.Show();//你调用了B类的Show方法.
((A)b).Show();//你调用了A类的Show方法.
C c = new C();
c.Show();//你调用了C类的Show方法.
((A)c).Show();//你调用了C类的Show方法.
Console.ReadLine();
}
}
class A
{
public virtual void Show()
{
Console.WriteLine( "你调用了A类的Show方法. ");
}
}
class B : A
{
public new void Show()
{
Console.WriteLine( "你调用了B类的Show方法. ");
}
}
class C : A
{
public override void Show()
{
Console.WriteLine( "你调用了C类的Show方法. ");
}
}
class D : A
{
public sealed override void Show()
{
Console.WriteLine( "你调用了C类的Show方法. ");
}
}
class E : D
{
//无法重写继承的成员,因为它已被密封
//public override void Show()
//{
// Console.WriteLine( "你调用了C类的Show方法. ");
//}
//public sealed override void Show()
//{
// Console.WriteLine( "你调用了C类的Show方法. ");
//}
//隐藏基类的方法
public new void Show()
{
Console.WriteLine( "你调用了C类的Show方法. ");
}
}
}