- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace Test
- {
- class Program
- {
- static void Main(string[] args)
- {
- B b = new B();
- A a = new A();
- a.Fun2(b);
- b.Fun2(a);
- }
- public class A
- {
- public virtual void Fun1(int i)
- {
- Console.WriteLine(i);
- }
- public void Fun2(A a)
- {
- a.Fun1(1);
- this.Fun1(5);//实际上在Fun1()前省略了this
- }
- }
- public class B : A
- {
- public override void Fun1(int i)
- {
- base.Fun1(i + 1);
- }
- }
- }
- }
复制代码 1.使用类B实例化对象b
2.使用类A实例化对象a
3.a.Fun2(b),调用a中的Fun1()方法,将对象b传给形参a,并向上转型;
a)执行a.Fun1(1),该方法中的a指向的实际上是对象b,故调用B中的方法Fun1(1),又base.Fun1(2)调用父类中的方法Fun(2),输出2;
b)执行Fun(5),这里实际上是this.Fun(5),这里没有使用a对象调用函数,直接在A中寻找Fun1(5),输出5;
4.b.Fun2(a),调用b中的Fun1()方法,将对象a传给形参b,并向下转型;
a)执行a.Fun(1),该方法中的b指向的实际上是对象a,故调用A中的方法Fun1(1),输出1;
b)执行Fun(5),这里实际上this.Fun(5),this代表的是对象b,故调用B中的方法Fun(5),又base.Fun(6)调用父类中的方法Fun(6),输出6
最后输出结果应该是 2 5 1 6
个人观点,仅供参考
如有错误,欢迎指出
|