C#核心知识回顾——3.继承构造、拆装箱、多态

news2024/11/24 2:51:36
1.继承中的构造函数:

特点:
  当申明一个子类对象时
  先执行父类的构造函数,再执行子类的构造函数

注意!!:
  1.父类的无参构造很重要
  2.子类可以通过base关键字代表父类调用父类构造

public class Mother 
{
    //父类的无参构造很重要
    //子类实例化默认调用父类无参构造,如果父类无参构造被顶掉,会报错
    public Mother() { }

    public Mother(int i) { }
}
public class son: Mother
{
    
}

使用base关键字: 

public class Mother 
{
    public Mother(int i) { }
}
public class son: Mother
{
    //通过bade指定父类构造
    public son(int i):base(i) { }
}

使用this关键字:

public class Mother 
{
    public Mother(int i) { }
}
public class son: Mother
{
    //通过bade指定父类构造
    public son(int i):base(i) { }

    /// <summary>
    /// 用 this 相当于调用son(int i)这个函数。
    /// 运行流程就是:父类构造--son(int i)--son(int i,int j)
    /// </summary>
    public son(int i,int j):this(i) { }
}

2.object和拆装箱:

public class Mother {}
public class son: Mother{
    public void send()
    {
        Debug.Log("son");
    }
}
public class GetInfo : MonoBehaviour
{
    private void Start()
    {
        Mother mother = new son();
        //万物之父object
        object obj = mother;        

        //引用类型:
        //1.普通
        object objson = new son();
        //转换使用
        if(obj is son)
        {
            (obj as son).send();
        }
        //2.特殊引用类型(string、数组)
        object str = "123";
        //两种方式
        string str2 = str as string;
        string str3 = str.ToString();

        object arr = new int[10];
        //两种方式
        int[] ar = arr as int[];
        int[] ar2 = (int[])arr;

        //值类型:
        object o = 1f;
        //转换使用,强转
        float f = (float)o;
    }   
}

值类型存入object:装箱。     object转换为值类型:拆箱。

装箱
把值类型用引用类型存储
栈内存会迁移到堆内存中

拆箱
把引用类型存储的值类型取出来
堆内存会迁移到栈内存中

好处:不确定类型时可以方便参数的存储和传递
坏处:存在内存迁移,增加性能消耗

3.多态:

静态多态:
编译时多态一函数重载,开始就写好的


运行时多态(vo b、抽象函数、接口):
1.vob
v:virtual(虚函数)
o:override(重写)
b:base(父类)

2.抽象类、抽象方法

3.接口

1.vob重写虚方法: 

public class Mother {
    public void Set()
    {
        Debug.Log("mother");
    }
    /// <summary>
    /// 虚函数定义
    /// </summary>
    public virtual void Get() {
        Debug.Log("mm");
    }
}
public class son: Mother{
    public new void Set()
    {
        Debug.Log("son");
    }
    /// <summary>
    /// 重写虚函数
    /// </summary>
    public override void Get()
    {
        //base.Get();
        Debug.Log("sss");
    }
}
public class GetInfo : MonoBehaviour
{
    private void Start()
    {
        ///未使用多态,此时输出的还是父类方法的函数
        Mother mom = new son();
        mom.Set();

        ///使用多态输出的是子类的
        mom.Get();
    }   
}

2.抽象类、抽象方法

抽象类:被抽象关键字abstract修饰的类

特点:
1.不能被实例化的类
2.可以包含抽象方法
3.继承抽象类必须重写其抽象方法

抽象方法:

又叫纯虚方法
用abstract关键字修饰的方法

特点
1.只能在抽象类中申明
2.没有方法体
3.不能是私有的
4.继承后必须实现用override重写

 abstract class Mother {
    public string name;
    
    //抽象方法必须是public,且没有方法体
    public abstract void BodyDof();
}
class Son : Mother
{
    public override void BodyDof(){}
}

总结:
抽象类被abstract修饰的类不能被实例化可以包含抽象方法
抽象方法没有方法体的纯虚方法继承后必须去实现的方法

注意:
如何选择普通类还是抽象类
1.不希望被实例化的对象,相对比较抽象的类可以使用抽象类
2.父类中的行为不太需要被实现的,只希望子类去定义具体的规则的可以选择抽象类然后使用其中的抽象方法来定义规则

作用:
整体框架设计时会使用

 

 abstract class Piture {  
    public abstract void MianJi();
    public abstract void ZhouChang();
}
class Yuan : Piture
{
    public override void MianJi()
    {
        Debug.Log("圆面积π*r*r");
    }

    public override void ZhouChang()
    {
        Debug.Log("圆周长2*π*r");
    }
}
class JuXing : Piture
{
    public override void MianJi()
    {
        Debug.Log("矩形面积a*b");
    }

    public override void ZhouChang()
    {
        Debug.Log("矩形周长2*(a+b)");
    }
}

 3.接口:

接口是行为的抽象规范
它也是一种自定义类型
关键字:interface

接口申明规范
1.不包含成员变量
2.只包含方法、属性、索引器、事件
3.成员不能被实现
4.成员可以不用写访问修饰符,不能是私有的
5.接口不能继承类,但是可以继承另一个接口

接口的使用规范
1.类可以继承多个接口
2.类继承接口后,必须实现接口中所有成员

特点:
1.它和类的申明类似
2.接口是用来继承的
3.接口不能被实例化,但是可以作为容器存储对象

 interface Piture {
    //方法
    void Name();
    //属性
    string Info
    {
        get; 
        set;
    }
    //索引器
    int this[int index]
    {
        get;
        set;
    }
    //事件
    event Action eventthing; 
}
class Yuan : Piture
{
    //1.类可以继承1个类,n个接口
    //2.继承接口,必须实现全部内容,并且都是public
    public int this[int index] {
        get { return 0; }
        set { } }
    public string Info { 
        get { return ""; }
        set { } }
    public event Action eventthing;
    /// <summary>
    /// 3.实现的接口函数,可以继续加virtual在子类重写
    /// </summary>
    public virtual void Name(){}
}

接口的使用场景:

 

显示实现接口:

当一个类继承两个接口
但是接口中存在着同名方法时
注意:显示实现接口时不能写访问修饰符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/703240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【单片机】STM32单片机,定时器的输入捕获,基于捕获的频率计,STM32F103

文章目录 简单介绍外部计数频率计TIM5 频率计 简单介绍 下面的定时器都具有输入捕获能力&#xff1a; 外部计数频率计 查看另一篇文章&#xff1a;https://qq742971636.blog.csdn.net/article/details/131471539 外部计数频率计的缺点&#xff1a;需要两个定时器配合&#x…

控制 显示、隐藏

1、使用 v-if < v-if"isShow"></> data(){ return:{ isShow:false } } if (concepts && concepts.length >0){ this.isShow nv.concepts.includes(snap) } 确认 数组中有某个 字段&#xff0c;用includes 有&…

Qt QGraphics导入背景图并绘制图形,画布移动、缩放、图形旋转等

前言 之前写过一篇博文《Qt鼠标拖动绘制基本几何图形》 &#xff0c;这是介绍使用QGraphic中利用鼠标事件实现基本几何图形的绘制&#xff0c;支持直线、矩形、圆形、椭圆&#xff0c;本次是在此基础上进行扩展&#xff0c;实现背景图导入&#xff0c;并在图片上进行几何图形绘…

现货白银行情实时行情与展望

现货白银作为低门槛、高收益的贵金属投资工具&#xff0c;因为交易时间自且没有涨跌幅限制而大受全球投资者追捧&#xff0c;它每天的实时行情走势中充满机会&#xff0c;投资者可结合技术和基本面分析手段&#xff0c;预测其未来的价格走势&#xff0c;在市场的波动中把握住获…

Go编写流量代理工具

目录 这是一个演示主要分为俩包&#xff1a;流程&#xff1a;逻辑&#xff1a;(端口随意&#xff0c;本地ssh为例)用法&#xff1a;文件地址&#xff1a;代码如下&#xff1a; 这是一个演示 代理本地HTTP服务 代理局域网SSH服务 其他的TCP服务没测试了 主要分为俩包&#x…

什么是DevOps? 什么是DORA?

1. 前言 对于搞云原生应用的同学&#xff0c;对于DevOps和DORA应该都不陌生。但对于传统应用程序开发的同学&#xff0c;经常被DevOps, Microservice, CICD, DORA这些新颖的名词搞得晕头转向。那么到底什么是DevOps? 什么是DORA呢&#xff1f; 2. 解析 2.1 DevOps DevOps并…

群晖NAS搭建WebDV服务手机ES文件浏览器远程访问

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址 转载自cpolar极点云文章&#xff1a;群晖NAS搭建WebDAV服务手机ES文件浏览器远程访问 有时候我们想通过移动设备访问群晖NAS 中的文件,以满足特殊需求,我们在群辉中开启WebDav服…

支持刷机(OpenWrt)的路由器大全

2023年上半年最热门的刷机路由器当然是360T7、小米WR30U这两款&#xff0c;主要是性价比高&#xff0c;闲鱼100多搞定&#xff0c;支持刷OpenWrt、支持WiFi6&#xff0c;采用MTK798X系列处理器&#xff0c;性能强&#xff0c;轻松跑满千兆&#xff0c;如果你想追新&#xff0c;…

SpringMVC基础知识

一、SpringMVC 1. Spring与Web环境集成 1.1 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的&#xff0c;但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件…

云捷|打破应用孤岛加速企业数字化转型

CBG云服务BU X 神州数码云基地 一、引言 从流程信息化到整体的数字化转型&#xff0c;对企业而言是一场深刻的升级再造。企业在决心开启数字化转型之路后&#xff0c;有近5成民营企业数字化转型采用标准化工具&#xff1b;关于“贵公司未来将在工作中增加哪些数字应用的使用…

强化学习从基础到进阶-案例与实践[4.2]:深度Q网络DQN-Cart pole游戏展示

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

基于PaddleDetection fairmot目标跟踪 C++ 部署

1 源码下载 PaddleDetection 2 工程编译 参考&#xff1a;paddle 目标检测C部署流程 3 导出模型 python tools/export_model.py -c configs/mot/fairmot/fairmot_dla34_30e_576x320.yml --output_dir ./inference -o weightshttps://paddledet.bj.bcebos.com/models/mot/…

AutoSAR系列讲解(入门篇)4.7-BSW的Diagnostics功能

一、架构与术语解释 首先简单介绍以下诊断&#xff08;Diagnostics&#xff09;&#xff0c;由于百度百科中就有很好的解释&#xff0c;这里直接引用一下&#xff1a; 汽车诊断技术是凭借仪器设备对汽车进行性能测试和故障检查的方法和手段&#xff0c;它能够测试出汽车各项工作…

CMU 15-445 -- 存储篇 - 02

CMU 15-445 -- 存储篇 - 02 引言Database StorageDisk Manager 简介计算机存储体系为什么不使用 OS 自带的磁盘管理模块磁盘管理模块的核心问题在文件中表示数据库File StorageDatabase PagesHeap File OrganizationPage LayoutData LayoutTuple LayoutTuple Storage Data Repr…

Windows Update当前无法检查更新怎么办?

当进行Windows更新或升级时&#xff0c;可能会提示“Windows Update当前无法检查更新&#xff0c;因为未运行服务。您可能需要重新启动计算机”。而当重启也无法解决问题时&#xff0c;我们该怎么办呢&#xff1f;下面我们就来了解一下。 1、删除Software Distribution文件夹中…

Hyperledger Fabric交易流程分析

1、交易流程 客户端利用受支持的SDK(Golang、Java、Node、Python)提供的API构建交易提案请求&#xff0c;将交易事务提案打包成为一个正确的格式。交易提案包含如下要素&#xff1a; ①channelID:通道信息。 ②chaincodelD:要调用的链码信息。 ③timestamp:时间戳。 ④sign:客户…

百度智能车竞赛丝绸之路2——手柄控制

百度智能车竞赛丝绸之路1——智能车设计与编程实现控制 百度智能车竞赛丝绸之路2——手柄控制 一、机器人设计 二、实现原理 本教程使用Python的Serial库和Struct二进制数据解析库去实现Xbox手柄百度大脑学习开发板&#xff08;上位机&#xff09;和机器人控制器&#xff08;…

9小时通关 黑马新教程发布,含重磅项目~

随着测试行业的蓬勃发展&#xff0c;对从业者的要求越来越高&#xff0c;自动化测试已经成为软件测试中一个重要组成部分&#xff0c;广泛应用于各行各业。甚至&#xff0c;在圈子中还流传着这样一句话&#xff1a;学好测试自动化&#xff0c;年薪30万不在话下&#xff01; 今…

Qt读写文件

一、界面 项目文件结构 样例文件 中芯国际近期做出了两个重要改变&#xff1a;第一个是调整财报披露方式&#xff0c;不再公布芯片制程的营收占比&#xff0c;而只公布晶圆尺寸的营收占比&#xff1b;第二个是撤消14nm工艺的官方展示&#xff0c;只有28nm、40nm及以上的芯片工…

LeNet基础

目录 1.LeNet简介 1.1基本介绍 1.2网络结构 2.LetNet在pytorch中的使用 2.1首先定义模型 2.2初始化数据集&#xff0c;初始化模型&#xff0c;同时训练数据。 2.3 训练结果​编辑 2.4绘制曲线 1.LeNet简介 1.1基本介绍 LeNet&#xff08;LeNet-5&#xff09;是历史上第…