当前位置: 首页 > news >正文

C#---第十九课:不同类型方法的执行顺序(new / virtual / common / override)

本文介绍不同类型的方法,在代码中的执行顺序问题:

  • 构造方法
  • 普通方法(暂用common代替)、虚方法(Virtual修饰)、New方法(new修饰)三个优先级相同
  • overide方法(会替换virtual方法,此时virtual方法被隐藏,无法再调用到)


1. 构造函数方法(constructor)优先级最高,new/common/virtual/这三个修饰的方法优先级相同

  • 当父类、子类中的方法都是new/common/virtual/这三类的时候,可以理解为实例化对象的类型(等号左边的类型)是什么,就优先调用哪个类中的方法。
  • 父类初始化之后,无法生成子类的实例化对象。因整个过程,没有初始化子类的过程,不会生成子类对象。

在这里插入图片描述



在这里插入图片描述


using ConsoleDeomAlien;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleDeomAlien
{public class Product{public Product(){Console.WriteLine("old Constructor-------Product");}public void Intro(){Console.WriteLine("old method--------Intro\n");}}public class NewProduct : Product{public NewProduct(){Console.WriteLine("new Constructor-------NewProduct");}// 这里使用new修饰或不用new都可以。都代表对父类进行重写。// 如果父类注定要被子类重写的,父类中可以写个空方法,后续子类直接重写即可。public new void Intro()  {Console.WriteLine("new method--------Intro\n");}}public class MainMethod{public static void Main(){Product p = new Product();		// 初始化和实例对象是相同的,此时该class中的方法仅仅是被重写(未被覆盖),改方法还起作用。// 最终,有限调用自己class中的方法p.Intro();NewProduct np = new NewProduct();// 子类优先调用该类下面的方法。np.Intro();Product p_np = new NewProduct();// 初始化对象是用的子类,但是对象是父类类型,最终会优先调用父类的方法。p_np.Intro();// !!!不符合逻辑的实例化过程,因为父类初始化之后,没有调用子类的构造函数,无法生成子类的实例对象!!!// NewProduct np_p = new Product ();Console.ReadKey();}}
}

old Constructor-------Product
old method--------Introold Constructor-------Product
new Constructor-------NewProduct
new method--------Introold Constructor-------Product
new Constructor-------NewProduct
old method--------Intro


2. virtual / override 修饰的父、子类中的方法,最终virtual方法会被覆盖(且virtual被隐藏,无法起作用)

在这里插入图片描述

using ConsoleDeomAlien;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleDeomAlien
{public class Product{public virtual void Intro(){Console.WriteLine("old method--------Intro\n");}}public class NewProduct : Product{public override void Intro(){Console.WriteLine("new method--------Intro\n");}}public class MainMethod{public static void Main(){Product p = new Product();p.Intro();NewProduct np = new NewProduct();np.Intro();// 虽然实例对象是父类,但是调用不到父类的方法了,因为被隐藏了。Product p_np = new NewProduct();  p_np.Intro();Console.ReadKey();}}
}

old method--------Intronew method--------Intronew method--------Intro
  • 构造方法的优先级最高
  • 父类中的void方法会被子类中的普通(common)方法或virtual 方法覆盖。virtual & common 同等级。
  • 当子类中没override的时候,new会覆盖virtual / common
  • 当override存在时,virtual会被替代掉(virtual可以父类无法调用到virtual中的方法)
http://www.lryc.cn/news/142370.html

相关文章:

  • [pytorch]torch.cuda用法以及判断显卡是不是存在问题
  • JUC——多线程补充
  • 代码随想录第32天|122.买卖股票的最佳时机 II,55. 跳跃游戏 ,45. 跳跃游戏 II
  • Linux:Nginx服务与搭建
  • 4、什么是NoSQL
  • 如何自己实现一个丝滑的流程图绘制工具(一)vue如何使用
  • ReoGrid.NET集成到winfrom
  • Elasticsearch实现增删改查
  • Rust 学习笔记(卷二)
  • android amazon 支付接入
  • Vue2-快速搭建pc端后台管理系统
  • 【产品文档】团队介绍PPT模板
  • 组件库的使用和自定义组件
  • 网站和API支持HTTPS,最好在Nginx上配置
  • UnitTest笔记: 拓展库DDT的使用
  • 裂缝检测,只依赖OPENCV,基于YOLO8S
  • python编程环境使用技巧3-程序打包pyinstaller
  • Go 自学:defer关键字
  • 【云计算】Docker特别版——前端一篇学会
  • .net使用RabbitMQ小记
  • layUI 中 穿梭框无法获取值的细节问题
  • Kaggle回归问题Mercedes——Benz Greener Manufacturing
  • 天润融通「微藤大语言模型平台2.0」以知识驱动企业高速增长
  • 【BUG】解决安装oracle11g或12C中无法访问临时位置的问题
  • 2. 使用IDEA创建Spring Boot Hello项目并管理依赖——Maven入门指南
  • Python在电路课程中的应用
  • Spark SQL join的三种实现方式
  • wazuh环境配置和漏洞复现
  • 九五从零开始的运维之路(其三十六)
  • 同步和异步有什么区别,使用场景?