黑马程序员技术交流社区
标题:
多态的基本问题
[打印本页]
作者:
贡宗新
时间:
2013-5-10 15:07
标题:
多态的基本问题
本帖最后由 贡宗新 于 2013-5-12 13:39 编辑
有时候这种迷惑人的问题真让人头晕,大家帮忙分析一下,
不使用多态的时候:
class A
{
public void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
static void Main(string[] args)
{
Program p = new Program();
p.Fun();
Console.Read();
}
}
//结果为:I am F
复制代码
使用new来隐藏父类方法,所以调用的时候就直接调用子类方法:
class A
{
public void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
public new void Fun()
{
int i = 1;
Console.WriteLine("I am F,i={0}", i);
}
static void Main(string[] args)
{
Program p = new Program();
p.Fun();
Console.Read();
}
}
//结果为:I am F,i=1
复制代码
当使用虚方法重写时:也是直接调用子类方法
class A
{
public virtual void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
public override void Fun()
{
int i = 1;
Console.WriteLine("I am F,i={0}", i);
}
static void Main(string[] args)
{
A p = new Program();
p.Fun();
Console.Read();
}
}
//结果是I am F,i=1;
复制代码
但是,当父类是虚方法,子类是new(隐藏了父类方法,不知道这样说准不准确):结果为什么是父类的结果:不明白???
class A
{
public virtual void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
public new void Fun()
{
int i = 1;
Console.WriteLine("I am F,i={0}", i);
}
static void Main(string[] args)
{
A p = new Program();
p.Fun();
Console.Read();
}
}
//结果为 I am F
复制代码
当基类函数是虚函数时,子类函数不是重写,而是覆盖了基函数的同名函数。这句话怎么理解
作者:
Jacky_Chen1990
时间:
2013-5-10 15:17
占楼,坐等达人回答问题
作者:
王宝生
时间:
2013-5-10 15:27
当基类中不是虚函数时 A a=new Program();调用的是A中定义的Fun。这显然不是我们想要的结果。因为a现在指向的是一个Program对象,理应调用Program中的Fun方法。
解决办法如你所做的,将基类A的Fun生命为virtual,这时候Program中的Fun就将A中的Fun给覆盖了(换句话说Program中的Fun把A中的Fun给遮住了,A中的Fun看不见了)所以此时调用的是Program中的Fun.
作者:
陈晖
时间:
2013-5-10 17:19
重写,需要在父类的方法前加修饰符virtual,子类的方法前加修饰符override,
加new只是显示隐藏这个父类的方法,不加则是隐式隐藏这个父类的方法,
根据类型还是可以访问指定的方法,但重写之后,就只看重写之后的方法了。
:)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2