您好,登录后才能下订单哦!
小编给大家分享一下C#类中方法执行顺序指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
有些中级开发小伙伴还是搞不太明白在继承父类以及不同场景实例化的情况下,父类和子类的各种方法的执行顺序到底是什么,下面通过场景的举例来重新认识下方法的执行顺序:
(下面内容涉及到了C#中的继承,构造函数,虚方法,虚方法的重写,new关键字等知识点)
有子类继承,但是只实例化父类:只执行A对象,输出A对象的信息
class A { public A() => Console.WriteLine("A的构造函数"); public virtual void Fun() => Console.WriteLine("A的方法"); } class B : A { public B() => Console.WriteLine("B的构造函数"); public void Fun() => Console.WriteLine("B的方法"); } 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()方法,故运行结果为:
实例化子类,子类和父类的构造函数的执行顺序:当执行B对象时,因为继承A对象,所以首先执行基类A的构造函数
class A { public A() => Console.WriteLine("A的构造函数"); public virtual void Fun()=> Console.WriteLine("A的方法"); } class B : A { public B() => Console.WriteLine("B的构造函数"); public void Fun() => Console.WriteLine("B的方法"); } class Program { static void Main(string[] args) { B b = new B(); b.Fun(); Console.ReadKey(); } }
上述Main方法中在new B对象时,由于B继承A,先执行父类的构造函数,所以先执行A中的构造函数A(),然后在执行B中的构造函数B(),故运行结果为:
父类有虚方法,子类没有使用(override)关键字重写父类方法的时候,使用的是new关键字时:
class A { public A()=> Console.WriteLine("A的构造函数"); public virtual void Fun() => Console.WriteLine("A的方法"); } class B : A { public B() => Console.WriteLine("B的构造函数"); //不写new时,该方法会抛出警告,但不是错误 public new void Fun()=> Console.WriteLine("B的方法"); } class Program { static void Main(string[] args) { A a = new B(); a.Fun(); Console.ReadKey(); } }
上述Main方法中先new B对象,先执行A中的构造函数A(),然后在执行B中的构造函数B(),最后调用class A的Fun()方法(没有重写父类方法),故运行结果为:
父类有虚方法, 当子类重写了(override)父类的方法时:
class A { public A()=> Console.WriteLine("A的构造函数"); public virtual void Fun() => Console.WriteLine("A的方法"); } class B : A { public B()=> Console.WriteLine("B的构造函数"); public override void Fun()=> Console.WriteLine("B的方法"); } static void Main(string[] args) { A a = new B(); a.Fun(); Console.ReadKey(); }
上述Main方法同样是先new B对象,先执行A中的构造函数A(),然后在执行B中的构造函数B(),但是子方法中使用了override关键字“覆盖”,使得子类中方法覆盖了父类中的方法,无法再访问父类中原始方法。(要重写方法,父类方法必须有virtual关键字),所以其运行结果为:
基类是接口层,多重继承时:
interface I { void Fun(); } class A : I { public A() => Console.WriteLine("A的构造函数"); public virtual void Fun() => Console.WriteLine("A的方法"); } class B : A { public B() => Console.WriteLine("B的构造函数"); //不写new时,该方法会抛出警告 public new void Fun() =>Console.WriteLine("B的方法"); } static void Main(string[] args) { B b = new B(); b.Fun(); ((A)b).Fun(); ((I)b).Fun(); Console.ReadKey(); }
打印结果:
当多重继承,子类重写override父类方法时:
interface I { void Fun(); } class A : I { public A() => Console.WriteLine("A的构造函数"); public virtual void Fun() => Console.WriteLine("A的方法"); } class B : A { public B() => Console.WriteLine("B的构造函数"); public override void Fun() =>Console.WriteLine("B的方法"); } static void Main(string[] args) { B b = new B(); b.Fun(); ((A)b).Fun(); ((I)b).Fun(); Console.ReadKey(); }
打印结果:(对比场景5)
使用new重写父类方法,同时让每个子类都继承接口:
interface I { void Fun(); } class A : I { public A() => Console.WriteLine("A的构造函数"); public virtual void Fun() => Console.WriteLine("A的方法"); } class B : A, I { public B() => Console.WriteLine("B的构造函数"); //不写new时,该方法会抛出警告 public new void Fun() => Console.WriteLine("B的方法"); } static void Main(string[] args) { B b = new B(); b.Fun(); ((A)b).Fun(); ((I)b).Fun(); Console.ReadKey(); }
打印结果:
C#是一个简单、通用、面向对象的编程语言,它由微软Microsoft开发,继承了C和C++强大功能,并且去掉了一些它们的复杂特性,C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程从而成为.NET开发的首选语言,但它不适用于编写时间急迫或性能非常高的代码,因为C#缺乏性能极高的应用程序所需要的关键功能。
以上是“C#类中方法执行顺序指的是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。