zoukankan      html  css  js  c++  java
  • C#继承的执行顺序

    自己对多态中构造函数、函数重载执行顺序和过程一直有些不理解,经过测试,对其中的运行顺序有了一定的了解,希望对初学者有些帮助。

    eg1:

    public  class A
        {
            public A()
            { 
                Console.WriteLine('A'); 
            }
            public virtual void Fun()
            {
                Console.WriteLine("A.Fun()"); 
            }
        }
    
        public class B : A
        {
            public B()
            { 
                Console.WriteLine('B');
            }
            public void Fun()
            { 
                Console.WriteLine("B.Fun()"); 
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                A a = new A();
                a.Fun();
                Console.ReadLine();
            }
        }

    上述Main方法中在new A对象时,程序首先进入class A中,执行class A的构造函数A(),然后执行class A中的Fun()方法,故运行结果为:

    eg2:

    public  class A
        {
            public A()
            { 
                Console.WriteLine('A'); 
            }
            public void Fun()
            {
                Console.WriteLine("A.Fun()"); 
            }
        }
    
        public class B : A
        {
            public B()
            { 
                Console.WriteLine('B');
            }
            public void Fun()
            { 
                Console.WriteLine("B.Fun()"); 
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                B b = new B();
                b.Fun();
                Console.ReadLine();
            }
        }

    上述Main方法中在new B对象时,由于B:A先执行父类的构造函数,所以先执行A中的构造函数A(),然后在执行B中的构造函数B(),故运行结果为:

    eg3:

    public  class A
        {
            public A()
            { 
                Console.WriteLine('A'); 
            }
            public void Fun()
            {
                Console.WriteLine("A.Fun()"); 
            }
        }
    
        public class B : A
        {
            public B()
            { 
                Console.WriteLine('B');
            }
            public void Fun()
            { 
                Console.WriteLine("B.Fun()"); 
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                /*   B b = new A();  错误
                 * A是父类,不能new一个父类对象指向子类,例:中国人是人类的对象,人类的对象不一定是中国人*/
                A a = new B();
                a.Fun();
                Console.ReadLine();
            }
        }

    上述Main方法中先new B对象,先执行A中的构造函数A(),然后在执行B中的构造函数B(),最后调用class A的Fun()方法,故运行结果为:

     eg4:

    public  class A
        {
            public A()
            { 
                Console.WriteLine('A'); 
            }
            public virtual void Fun()
            {
                Console.WriteLine("A.Fun()"); 
            }
        }
    
        public class B : A
        {
            public B()
            { 
                Console.WriteLine('B');
            }
            public override void Fun()
            { 
                Console.WriteLine("B.Fun()"); 
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                A a = new B();
                a.Fun();
                Console.ReadLine();
            }
        }

    上述Main方法同样是先new B对象,先执行A中的构造函数A(),然后在执行B中的构造函数B(),但是子方法中使用了override关键字“覆盖”,使得子类中方法覆盖了父类中的方法,无法再访问父类中原始方法。(要重写方法,父类方法必须有virtual关键字),所以其运行结果为:

    eg5:

    public  class A
        {
            public A()
            { 
                Console.WriteLine('A'); 
            }
            public virtual void Fun()
            {
                Console.WriteLine("A.Fun()"); 
            }
        }
    
        public class B : A
        {
            public B()
            { 
                Console.WriteLine('B');
            }
            public new void Fun()
            { 
                Console.WriteLine("B.Fun()"); 
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                A a = new B();
                a.Fun();
                Console.ReadLine();
            }
        }

    上述Main方法同样是先new B对象,先执行A中的构造函数A(),然后在执行B中的构造函数B(),但是子方法中使用了new关键字,由于其仍是a是A类型对象,所以仍然调用A中的方法,其运行结果如下:

    1.B继承A,请问a是A的实例还是B的实例啊? 
    答:B的实例
    2.对象a可以调用A类中的方法吗?可以调用B的方法吗? 
    答:不一定,如果是虚拟方法,并且在B类重载了A的虚拟方法,a将会调用B的同名方法,普通方法会调用A的方法
  • 相关阅读:
    LambdaExpressions(Lambda表达式)
    解密淘宝网的开源架构(转)
    使用Action、Func和Lambda表达式
    ASP.NET中进行消息处理(MSMQ) 二
    从内存变化看.NET代码执行机理(一)
    提高C#编程水平的50个要诀
    其他概念
    asp.net mvc相关开源项目
    为性能和可伸缩性做架构和设计上的Review
    你可能不知道的C#语言特性
  • 原文地址:https://www.cnblogs.com/Im-Victor/p/10570551.html
Copyright © 2011-2022 走看看