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

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();//万物之父objectobject 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.继承接口,必须实现全部内容,并且都是publicpublic 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.hqwc.cn/news/1047.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.设计模式之前5种设计模式单例工厂原型建造者适配器

1.怎么掌握设计模式? 独孤5剑 先是锋利的剑 后面是无剑才是最强的 ,GOF四人组写的<设计模式>书,包含了23种,实际可能还有其他,不要被束缚(只是覆盖了大部分).设计模式适合的人群: 1.不知道设计模式 2.有编程经验,但是写的好多代码有设计模式却不知道 3.学习过设计模式,发…

Audio API 实现音频播放器

市面上实现音频播放器的库有很多&#xff0c;比如wavesurfer.js、howler.js等等&#xff0c;但是都不支持大音频文件处理&#xff0c;100多M的文件就有可能导致程序崩溃。总之和我目前的需求不太符合&#xff0c;所以打算自己实现一个音频播放器&#xff0c;这样不管什么需求 在…

建设Web3需要Web2的人才?探索传统技能在Web3时代的作用

摘要&#xff1a;Web3作为下一代互联网技术的前沿&#xff0c;许多人关注着它的发展和应用。然而&#xff0c;建设Web3是否需要Web2的人才仍然是一个有争议的问题。 Web3作为下一代互联网技术&#xff0c;以去中心化、智能合约和用户自治等特点引起了广泛的关注。与此同时&…

JAVA1

文章目录 计算机的硬件与软件DOS命令 计算机的硬件与软件 DOS命令

大数据开发基础-环境配置篇-Hadoop集群安装

鼠鼠接下来将更新一系列自己在学习大数据开发过程中收集的资源、和自己的总结、以及面经答案、LeetCode刷题分析题解。 首先是大数据开发基础篇 环境搭建、组件面试题等 其次是更新大数据开发面经的java面试基础 最后更新一个大数据开发离线数仓的实战项目&#xff0c;自己写入…

Redis的数据类型及对应的数据结构(二)

接上篇&#xff1a;Redis的数据类型及对应的数据结构&#xff08;一&#xff09;_鱼跃鹰飞的博客-CSDN博客 本篇主要讨论剩下的几种数据结构的应用场景 应用场景 集合的主要几个特性&#xff0c;无序、不可重复、支持并交差等操作。 因此 Set 类型比较适合用来数据去重和保…

kafka生产者api和数据操作

Kafka 生产者 发送流程 消息发送过程中涉及到两个线程——main线程和Sender线程 main线程 使用serializer&#xff08;并非java默认&#xff09;序列化数据&#xff0c;使用partitioner确认发送分区 在main线程中创建了一个双端队列RecordAccumulator&#xff0c;main线程将…

【半监督医学图像分割 2023 CVPR】BCP

【半监督医学图像分割 2023 CVPR】BCP 论文题目&#xff1a;Bidirectional Copy-Paste for Semi-Supervised Medical Image Segmentation 中文题目&#xff1a;双向复制粘贴半监督医学图像分割 论文链接&#xff1a;https://arxiv.org/abs/2305.00673 论文代码&#xff1a;http…

新星计划2023【Java基础及数据库Mysql】学习方向报名入口!

新星计划2023【Java基础及数据库Mysql】学习方向报名入口&#xff01; 一、关于本学习方向导师二、关于本学习方向官方微信群三、关于活动时间&奖品&要求四、学习计划五、TOP5评选规则六、活动要求七、注意事项 本赛道是针对那些希望从事Java开发并且想要学习如何与数据…

【TCP/IP】多进程服务器的实现(进阶) - 多进程服务器模型及代码实现

经过前面的铺垫&#xff0c;我们已经具备实现并发服务器的基础了&#xff0c;接下来让我们尝试将之前的单任务回声服务器改装成多任务并发模式吧&#xff01; 多任务回声服务器模型 在编写代码前&#xff0c;先让我们大致将多任务&#xff08;回声&#xff09;服务器的模型抽象…

Jenkins自动化构建

自动化构建 Jenkins 是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测试和部署软件 Jenkins 支持各种运行方式&#xff0c;可通过系统包、Docker 或者通过一个独立的 Java 程序 安装依赖 安装参考&#xff1a;Windows环境下安装Jenkins **…

MySQL数据库——高级查询语句

MySQL数据库——高级查询语句 一、数据库查询二、高效查询方式1.指定指字段进行查询——SELECT2.对字段进行去重查询——DISTINCT3.条件查询——where3.逻辑关系的增加查询——and 和 or4.已知值的数据记录查询——IN5.范围内数据记录查询——BETWEEN6.通配符查询7.关键字排序查…