大家都知道new操作符可以用于实例化对象,还可以在子类中隐藏父类中的方法。如果实例化一个子类,不直接实例化父类的对象,让父类的对象的引用直接指向子类的对象,那么父类对象调用这个隐藏方法时候,还是在调用自己的这个方法,而没有调用子类中的这个方法,但是如果在子类中重写这个方法的话,当然父类对象要调用子类的方法,而不是自己的这个方法,因为已经被重写了,已经失去了功能了。以下是代码实例。
using
System;
namespace objectline
... {
/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
class A
...{
public void a()
...{
Console.WriteLine("A.a");
}
public virtual void b()
...{
Console.WriteLine("A.b");
}
}
class B:A
...{
public new void a()
...{
Console.WriteLine("B.a");
}
public override void b()
...{
Console.WriteLine("B.b");
}
}
class Class1
...{
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
...{
B b= new B();
A a = b;
b.a();//B.a
b.b();//B.b
a.a();//A.a
a.b();//B.b
}
}
}
namespace objectline
... {
/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
class A
...{
public void a()
...{
Console.WriteLine("A.a");
}
public virtual void b()
...{
Console.WriteLine("A.b");
}
}
class B:A
...{
public new void a()
...{
Console.WriteLine("B.a");
}
public override void b()
...{
Console.WriteLine("B.b");
}
}
class Class1
...{
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
...{
B b= new B();
A a = b;
b.a();//B.a
b.b();//B.b
a.a();//A.a
a.b();//B.b
}
}
}