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

C# Unity 面向对象补全计划 之 初识继承方法与多态

 本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正

本系列旨在通过补全学习之后,给出任意类图都能实现并做到逻辑上严丝合缝

1.继承方法

C# & Unity 面向对象补全计划 之 继承(字段与属性)-CSDN博客

本文讲述继承方法与多态性,是继承的重要伴随知识

我想实现如下内如:

有一个Computer类和一个Mycomputer类作为子类

父类提供推荐配置,而子类提出我自己的配置,并打印

1.1构造函数继承

子类构造函数会默认先调用父类构造函数

举个栗子:

Computer类:

class Computer {// 公共字段public string cpu ;// 私有字段private string gpu ;// 公共属性public string gpu_name {get => gpu;set => gpu = value;}// 公共构造函数public Computer() {cpu = "7500f及以上";gpu_name = "Rx580及以上";Console.WriteLine("{0},{1}",cpu,gpu_name);}// 公共自定义方法public virtual void Configuration() {}
}

当我执行Computer类的对象时,会输出如下:

子类继承: 

也可以用base关键词进行父类构造函数调用,用的不多故不做演示

class MyComputer : Computer {public MyComputer() {cpu = "5600";gpu_name = "3060";Console.WriteLine("{0},{1}", cpu, gpu_name);}
}

子类对象:

 输出:

如果父类构造函数是私有的话,就无法使用子类构造函数了

Q:我可以在调用子类构造函数的时候,不调用父类构造函数吗?

A:不行,因为这是语言设计的一部分,用于确保父类的成员被正确初始化

 1.2方法继承

我将Computer类添加了一个自定义方法,并将输出语句放到方法里

class Computer {// 公共字段public string cpu ;// 私有字段private string gpu ;// 公共属性public string gpu_name {get => gpu;set => gpu = value;}// 公共构造函数public Computer() {cpu = "7500f及以上";gpu_name = "Rx580及以上";}// 公共自定义方法public  void Configuration() {Console.WriteLine("{0},{1}", cpu, gpu_name);}
}

如果子类继承以后,写一个相同名字的方法,会输出什么?

MyComputer mycomputer = new MyComputer();
mycomputer.Configuration();
class Computer {// 公共字段public string cpu ;// 私有字段private string gpu ;// 公共属性public string gpu_name {get => gpu;set => gpu = value;}// 公共构造函数public Computer() {cpu = "7500f及以上";gpu_name = "Rx580及以上";}// 公共自定义方法public  void Configuration() {Console.WriteLine("{0},{1}", cpu, gpu_name);}
}class MyComputer : Computer {public MyComputer() {cpu = "5600";gpu_name = "3060";}public void Configuration(){Console.WriteLine("{0},{1}", cpu, gpu_name);}
}

不会继承,所以如果不做特殊处理的话,只会调用自己的方法

所以就用到了多态,直接跳到标题3:多态下

2.多态(上)

2.1方法重载

是指可以出现同名方法,规则如下:

public class Example
{public void Print(int a) { }public void Print(int a, int b) { }public void Print(double a) { }public void Print(int a, double b) { }public void Print(double a, int b) { }
}

2.2运算符重载 

运算符重载,一般也用的不多先用现学即可 

public static Complex operator +(Complex c1, Complex c2)
{return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
}
public static Complex operator +(Complex c1, Complex c2)
{return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
}

3.多态(下)

3.1虚方法(可以不重写)

在C#中,虚方法(virtual method)是指在基类中声明并可以在派生类中重写的方法

虚方法使用 virtual 关键字进行声明:

 public virtual void Configuration() {Console.WriteLine("推荐配置为{0},{1}", cpu, gpu_name);}

子类可以使用override关键字进行重写,并且添加逻辑:

   public override void Configuration(){      Console.WriteLine("我的配置为{0},{1}", cpu, gpu_name);Console.WriteLine("打印完毕");}

调用:

Computer computer = new Computer();
computer.Configuration();
MyComputer mycomputer = new MyComputer();
mycomputer.Configuration();

结果:

3.2抽象方法(强制重写)

抽象方法没有方法体,只包含在抽象类之中,只有方法签名,它们必须在派生类中实现

举个栗子:电脑这一概念的确就符合抽象的概念

abstract class Computer {// 公共字段public string cpu ;// 私有字段private string gpu ;// 公共属性public string gpu_name {get => gpu;set => gpu = value;}// 公共构造函数public Computer() {cpu = "7500f及以上";gpu_name = "Rx580及以上";}// 公共自定义方法public abstract void Configuration();      
}

子类继承的话,则强制进行方法重写:

 public override void Configuration(){      Console.WriteLine("我的配置为{0},{1}", cpu, gpu_name);Console.WriteLine("打印完毕");}

二者区别

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CC++内存魔术:掌控无形资源
  • 知识见闻 - 什么样的人值得结交
  • Prometheus 监控 Nginx
  • 【C++高阶】:C++11的深度解析下
  • Redis结合Lua脚本的简单使用
  • 使用MySQLdump定时备份数据库实战
  • [Kimi笔记]C# 中,public、private 和 internal 访问修饰符
  • H5+JS 4096小游戏
  • 从零入门CV图像竞赛(2024全球Deepfake攻防挑战赛)
  • Java基础:反射
  • 笑谈“八股文”,人生不成文
  • 【Kubernetes】k8s集群的资源发布方式
  • LSPatch制作内置模块应用软件无需root 教你制作内置应用
  • 【Java】深度解析Java的反射机制
  • 后端学习笔记(3)--Maven
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 〔开发系列〕一次关于小程序开发的深度总结
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • iOS编译提示和导航提示
  • Java到底能干嘛?
  • JS题目及答案整理
  • js写一个简单的选项卡
  • Linux链接文件
  • Mysql5.6主从复制
  • Python_OOP
  • 程序员最讨厌的9句话,你可有补充?
  • 大数据与云计算学习:数据分析(二)
  • 高性能JavaScript阅读简记(三)
  • 回流、重绘及其优化
  • 前端面试之闭包
  • 微信小程序实战练习(仿五洲到家微信版)
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 自动记录MySQL慢查询快照脚本
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • # 达梦数据库知识点
  • ## 基础知识
  • (7)svelte 教程: Props(属性)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)fiber的基本认识
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (六)激光线扫描-三维重建
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (七)Activiti-modeler中文支持
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET 常见的偏门问题
  • .NET 中创建支持集合初始化器的类型
  • .Net各种迷惑命名解释
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @Repository 注解
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例