C#继承

/*
 * 

第一次不使用this关键字的执行结果
--------------------
1.Parent
1.Child
1.ClassName:Child,MethodName:Test
--------------------
1.Parent
1.ClassName:Parent,MethodName:Test
--------------------
1.Parent
1.Child
1.ClassName:Parent,MethodName:Test

分析:代码的执行顺序
  Child c = new Child();实例化Child对象时,先后调用Parent、Child的构造方法,当Parent与Child中有同名的方法时(如Test方法),则谁发起调用,则调用谁的方法,
这里由Child发起,则调用Child的Test方法;也可以这样理解,先从Child中查找Test方法,如果找到了则执行方法,如果未找到,则从Parent中找,
直到在根类中检索完毕,如果还是没找到,则编译报错或是运行时报错。
  Parent p = new Parent();实例化Parent对象时,调用Parent的构造方法,接着调用Parent的Test方法,这不用解释了吧。
  Parent pc = new Child();这里用子类实例化后赋给了父类对象,这行代码可转换成Parent pc = new Child() as Parent;这里先实例化Child对象,先后调用Parent、Child的构造方法,
然后把Child对象转换成Parent对象,再由Parent对象调用Test方法。

第二次调用,比较this.GetType().Name与method.ReflectedType.Name,执行结果
--------------------
1.Parent
2.Child
3.ClassName:Parent,MethodName:.ctor  、、构造方法
1.Child
2.Child
3.ClassName:Child,MethodName:.ctor   、、构造方法
1.ClassName:Child,MethodName:Test
2.ClassName:Child,MethodName:Test
3.ClassName:Child,MethodName:Test
--------------------
1.Parent
2.Parent
3.ClassName:Parent,MethodName:.ctor   、、构造方法
1.ClassName:Parent,MethodName:Test
2.ClassName:Parent,MethodName:Test
3.ClassName:Parent,MethodName:Test
--------------------
1.Parent
2.Child
3.ClassName:Parent,MethodName:.ctor   、、构造方法
1.Child
2.Child
3.ClassName:Child,MethodName:.ctor    、、构造方法
1.ClassName:Parent,MethodName:Test
2.ClassName:Child,MethodName:Test
3.ClassName:Parent,MethodName:Test

分析:对象
  this指的是具体对象,当需要访问具体对象时可以用this,StackTrace使用的是堆栈回溯,可以得到运行时源码的信息、当前代码的行号,列号
  关于this.GetType().Name与上下文类名不一致,this原本指向子类Child。

*/



class MainClass
    {
        public static void Main(string[] args)
        {
            string splits = new string('-', 20);
            Console.WriteLine(splits);
            Child c = new Child();
            c.Test();
            Console.WriteLine(splits);
            Parent p = new Parent();
            p.Test();
            Console.WriteLine(splits);
            Parent pc = new Child();
            pc.Test();
            //Child cp = new Parent() as Child;//报异常
            //Child cp = new Parent() as Child;cp.Test();//cp=null,报异常,运行时错误

            Console.ReadLine();
        }
    }


    class Parent
    {
        public Parent()
        {
            Console.WriteLine("1.Parent");
			//Console.WriteLine("2.{0}",this.GetType().Name);
			//System.Reflection.MethodBase method = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod();
			//Console.WriteLine("3.ClassName:{0},MethodName:{1}", method.ReflectedType.Name, method.Name);
        }

        public void Test()
        {
            Console.WriteLine("1.ClassName:Parent,MethodName:Test"); Test2();
            //Console.WriteLine("2.ClassName:{0},MethodName:{1}",this.GetType().Name,new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name);
            //System.Reflection.MethodBase method = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod();
            //Console.WriteLine("3.ClassName:{0},MethodName:{1}", method.ReflectedType.Name, method.Name);
        }

        public void Test2() { }
    }

    class Child:Parent
    {
        public Child()
        {
            Console.WriteLine("1.Child");
			//Console.WriteLine("2.{0}",this.GetType().Name);
			//System.Reflection.MethodBase method = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod();
			//Console.WriteLine("3.ClassName:{0},MethodName:{1}", method.ReflectedType.Name, method.Name);
        }

        public new void Test()//使用new关键字隐藏父类的Test,编译器不会报警
        {
            Console.WriteLine("1.ClassName:Child,MethodName:Test"); Test2();
			//Console.WriteLine("2.ClassName:{0},MethodName:{1}", this.GetType().Name, new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name);
			//System.Reflection.MethodBase method = new System.Diagnostics.StackTrace().GetFrame(0).GetMethod();
			//Console.WriteLine("3.ClassName:{0},MethodName:{1}", method.ReflectedType.Name, method.Name);
        }
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值