请帮忙解释一下以下的一段简单代码
请问一下
以下的结果是A,为什么不是B呢,我都new了print阿
using System;
namespace aa
{
public class Test
{
public class A
{
public virtual void print()
{
Console.Out.WriteLine( "A ");
}
}
public class B:A
{
public new void print()
{
Console.Out.WriteLine( "B ");
}
}
static void Main(string[] argv)
{
A b = new B();
b.print();
Console.ReadLine();
}
}
}
以下的结果是B,为啥不是A呢难道override把A类都覆盖了?即使实例化的是B?
using System;
namespace aa
{
public class Test
{
public class A
{
public virtual void print()
{
Console.Out.WriteLine( "A ");
}
}
public class B:A
{
public override void print()
{
Console.Out.WriteLine( "B ");
}
}
static void Main(string[] argv)
{
A b = new B();
b.print();
Console.ReadLine();
}
}
}
[解决办法]
你的这两个程序正好说明了new和override的区别
用了override就没法访问父类的方法了
用new可以通过强制转换来访问父类的方法
[解决办法]
如果用的是new,即使父类的引用指向了派生类的对象,父类也看不到子类同名的方法(这个叫隐藏)
如果父类用的是virtual,子类用的是override,如果父类的引用指向了派生类的对象,父类调用此方法时将使用子类同名的方法(这个叫重写),也就是通常而言的多态
楼主需要补补面向对象的基础概念
[解决办法]
override覆写基类的方法,类型是基类,而表现确是派生类,这就是所谓多态性
而用new表示隐藏基类的方法,另外写了一个新的方法,两个方法不搭界,用基类类型当然调用基类的方法
[解决办法]
高人出手,我等混分...
[解决办法]
高歌比我抢先一步啊,我进来的时候,还没有呢
这样的基础问题,怎么发到ASP.NET区了?应该发在C#区才对~
[解决办法]
高人出手,我等混分...