public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
} public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
} public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i + 1);
}
}
public static void Main()
{
B b = new B();
A a = new A();
// a.Fun2(b)是指先执行A类下的Fun2函数
//Fun2函数下第一步是a.Fun1(1);
//但实际参数是a也就是执行a.Fun1(1);
//那b.Fun1(1)函数是在B类当中重载过的
//其内容是base.Fun1(i+1);
//也就是执行Fun1(1+1)
//结果是2
//然后执行Fun1(5)
//结果是5 a.Fun2(b); // b.Fun2(a)是指先执行B类下的Fun2函数
// 可B类本身就没有Fun2函数 只有执行它的基类的Fun2函数
//但实际参数是a也就是执行a.Fun1(1);
//结果是1
//然后执行Fun1(5) 注意这里的Fun1(5)实际上是b.Fun1(5)
//实际执行的结果是base.Fun1(5+1);
//结果是6
b.Fun2(a);
Console.ReadLine();
}请问
1。类b里的override是不是就完全把类a里的fun1()方法覆盖了。如果是那b.Fun2(a)怎么结果是1、6呢,
2。还有new和override好象都可以覆盖是吧,他们有什么区别呢。
3。上面的题目的解释感觉晕乎,谁可以解释详细点呢,谢谢。
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
} public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
} public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i + 1);
}
}
public static void Main()
{
B b = new B();
A a = new A();
// a.Fun2(b)是指先执行A类下的Fun2函数
//Fun2函数下第一步是a.Fun1(1);
//但实际参数是a也就是执行a.Fun1(1);
//那b.Fun1(1)函数是在B类当中重载过的
//其内容是base.Fun1(i+1);
//也就是执行Fun1(1+1)
//结果是2
//然后执行Fun1(5)
//结果是5 a.Fun2(b); // b.Fun2(a)是指先执行B类下的Fun2函数
// 可B类本身就没有Fun2函数 只有执行它的基类的Fun2函数
//但实际参数是a也就是执行a.Fun1(1);
//结果是1
//然后执行Fun1(5) 注意这里的Fun1(5)实际上是b.Fun1(5)
//实际执行的结果是base.Fun1(5+1);
//结果是6
b.Fun2(a);
Console.ReadLine();
}请问
1。类b里的override是不是就完全把类a里的fun1()方法覆盖了。如果是那b.Fun2(a)怎么结果是1、6呢,
2。还有new和override好象都可以覆盖是吧,他们有什么区别呢。
3。上面的题目的解释感觉晕乎,谁可以解释详细点呢,谢谢。
你是想知道为什么是6是吧
你调用的是b.Fun2(a);
这还真不是语言好表达的
其实你的类实际是这样的。。
你调用的是b类的fun2
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
} public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
} public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i + 1);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5); //调用上面的fun1,
}
}
2、用了new在父类中就会忽略子类的多态实现
3、这个题目没什么高深的,只是在忽悠人。
所有也继承了a类的Fun2方法
所以
b.Fun2(a);
是调用b类的fun2并不时a类的fun2、
而你override是从写了fun1方法。没有从写fun2
如果传入的是A这个和普通方法一样。
如果传入的是B,如果B的xxx方法是override的就会调用B类中的实现,如果是new的则不会调用B类中的xxx。
new是覆盖基类的方法
new是覆盖基类的方法。针对整个类。包括类成员!
因为b中没有fun2()方法,它继承和调用a中的fun2()方法。2楼说的很清楚!