C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记09--构造方法/析构方法/继承/多态/封装...
一.构造方法
当创建一个类时, 系统会自动创建一个默认的无参构造方法, 这个方法和类同名, 在创建对象的时候自动调用. 默认的构造方法里面什么也没有, 重写之后就可以在创建对象的时候同时搞点事情了.
构造方法主要负责对类里面的字段进行初始化。
1.1 格式:
public
1.2 注意事项:
- 构造方法必须要和类名重名;
- 构造方法没有返回值并且不加void, 但是可以有参数;
- 构造方法可以有多个重载;
- 构造方法只能在创建对象的时候才可以调用, 不能手动调用;
- 如果有带参数的构造方法, 想要调用默认构造必须显式的写出来;
二.析构方法
2.1 使用: 对象销毁之前都会自动调用析构方法
形象的来说, 我们玩游戏的时候把boss打死之后, boss会爆出各种装备金币,蓝啊之类的, 这些方法我们就可以在析构方法里面写;
2.2 语法:
~
2.3 注意:
- 只有类才有析构方法, 一个类只能有一个析构方法.
- 无法继承和重载析构方法;
- 不能手动调用, 对象在被销毁之前会自动调用;
- 析构方法没有访问修饰符, 没有参数;
- 必须和类名同名;
三.继承
3.1 概念:
继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。 其成员被继承的类称为“基类”,继承这些成员的类称为“派生类”。 派生类只能有一个直接基类(C#中))。 但是,继承是可传递的。 如果 ClassB 派生出 ClassC,ClassA 派生出 ClassB,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。
3.2 格式:
class
学过构造方法之后, 就想给每个类都写个构造方法,以便简化初始化操作. 但是尝试过后发现如果父类写了带参数的构造方法, 子类就会报错了, 如何解决? base带你飞.
3.3 继承父类的构造方法:
孩子在创建对象的时候, 会先调用父类的构造方法, 如果父类是无参的就没有影响, 但是如果父类有有参数的构造方法, 孩子就需要传参数. 调用父类有参的构造方法有两个方法:
- 在父类中显式的将默认构造写出来;
- 子类在重写构造方法的时候利用base关键字传入父类的参数;
// 父类有参的构造方法
3.4 注意:
- 继承具有单向性, a -> b , b不能继承a;
- C#中,只能继承一个父类但是可以多重继承;
- 父类也叫基类, 子类也叫派生类;
- 继承具有传递性; a -> b, b -> c a就具有了c和b所有属性和方法;
- 基类有的,派生类都有;派生类有的,基类可能没有。即:派生类可以赋值给基类,而基类不能赋值给派生类。
子类在继承的时候不管想不想都会继承父类的所有字段和方法, 那么如果子类想用同样的方法搞特殊呢? 那就要引入多态了.
四.多态
栗子: 就拿我们创建的僵尸们来说, 僵尸都会攻击, 但是普通僵尸(小口咬), 路障僵尸(大口咬)和铁桶僵尸(超大口咬)的攻击方法不同, 这就是多态;
4.1重写父类方法的多态:
1.在访问修饰后面加上new关键字后重写:
// 父类的Attack方法
那么问题来了, 我虽然重写了父类的Attack方法, 但是我在某个地方还是想要使用父类的Attack方法的时候怎么办呢?
加上base关键字:
// 子类中
小结base:
- 调用基类被派生类重写的方法;
- 指定调用基类中某一个指定的构造方法;
4.2 virtual override 的多态
用这种方法来实现多态需要做两件事情:
1> 将父类中要实现多态性的方法改成虚方法, 即在返回值类型前加关键字 virtual:
// 僵尸父类
2>子类重写父类的方法, 即将方法隐藏的关键字 new 改为 override.
// 路障僵尸子类
假如说现在有20个路障僵尸和10个铁桶僵尸, 他们现在都要进行攻击怎么实现? 借助数组呗. 那么问题又来了, 数组类型是什么? 数组中既有路障僵尸类又有铁桶僵尸类, 那想着能不能定义成他们的父类普通僵尸类呢? 要解决这个问题就需要用到里氏转换了.
4.3里氏转换
里氏转换的本质其实就是将父类强制转换成子类.
4.3.1 里氏转换第一原则
子类对象可以直接赋值给父类对象
// Main函数中
4.3.2 里氏转换第二原则
父类可以通过强制转换的方式转换成子类, 此时就可以调用子类中的成员了
- 使用is关键字判断类型
- 使用 as 关键字进行强制转换
// Main函数中
使用 as 关键字进行强转即使不成功也不会报错, 而是返回 null, 但是强行的 "ozb = (OstableZomby)zb" 转换如果不成功的话, 程序就会报错终止.
那么现在我们就是将数组问题解决了:
// Main函数中
五.封装
在C#中, 可以把类里面的这些字段进行私有化保护, 并为其添加共有属性, 在类的外面不能通过对象直接访问这些字段, 想要访问只能通过访问属性的方式来完成, 这就是封装. 具体操作在记录属性的时候其实就已经写了, 这里就不再记录了.
补充.结构体和类的区别:
- 结构体是值类型, 而类是引用类型;
- 结构体只能有两个构造方法, 一个是无参默认的(且不能显式写出来!), 一个是将所有字段都初始化的;
- 结构体不能被继承, 而类可以被继承;
- 类有多态性, 结构体没有多态性;
- 一般只操作一些数据或是以数据为主的用结构类型, 当表示有一些层级关系的时候用类;
- 结构体有装箱拆箱的操作(值类型), 而类没有装箱拆箱的操作(引用类型);
int
=======================================================
思维导图
C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记09--构造方法/析构方法/继承/多态/封装...相关推荐
- C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记11--接口/泛型
一.接口 1.1简介: 接口是一种特殊的引用类型, 和类很相似. 它定义了属性, 方法, 事件, 这些都作为接口的成员/ 接口中只包含成员的声明, 成员的定义是派生类的责任(谁继承谁实现). 接口在某 ...
- python面向对象编程中方法和属性_Python面向对象编程中关于类和方法的学习笔记...
Python面向对象编程中关于类和方法的学习笔记 类与类方法是面向对象的编程语言中必不可少的特性,本文总结了Python面向对象编程中关于类和方法的学习笔记,需要的朋友可以参考下 类和实例 pytho ...
- python描述符魔术方法_学习笔记-Python基础9-面向对象编程OOP-类的成员描述符(property)、类的常用内置属性、类的常用魔术方法、类和对象的三种方法...
一.类的成员描述符(property) 类的成员描述符是为了在类中,对类的成员属性进行相关操作而创建的一种方式,大部分属于数据清洗 属性有三种操作:get获取属性值.set修改或添加属性.delete ...
- EJB3.0学习笔记---多接口的时,实现类处理方法:
EJB学习笔记--- 1.胖客户端:指的是定义的接口太多了,接口做的工作太多; 胖接口: 2.EJB实现类型的定义,用注解的方式,当一个EJBbean,实现了多个接口的时候, 需要用注解的方式指明哪一 ...
- python引用类 魔法方法_Python 学习笔记 -- 类的魔法方法
常用魔法方法 含义 __new__(cls[,...]) 1.__new__在对象被实例化时调用 2.第一个参数是类本身,其他参数传入__init__中 3.__new__如果没有返回值,则不会调用_ ...
- 在类中用class时数据是共有还是私有_jvm学习笔记之class文件的加载、初始化
编写的java文件在要真正运行时,会首先被编译成 ".class"结尾的二进制文件,然后被虚拟机加载.那么在虚拟机中一个class文件要成为java实例,需要经历好几个步骤: 1. ...
- java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题
Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数, 1.当父类没有显式定义构造方法时, 编辑器会默认为此类添加一个隐式无参构造函数.此时子类可以有自 ...
- yolov8 全网唯一 类代码模式 ,方便研究修改,转onnx学习笔记
目录 一.基本介绍 二.模型构建 把yolov8参数构建方式改为类代码模式,方便修改研究,可以加载官方预训练模型,可以正确推理 作者的推理报错 三.转onnx
- java学习笔记7--抽象类与抽象方法
接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...
最新文章
- elasticsearch插件(4)
- c++ 头文件 .h 理解与实践
- 图形处理(二)固定边界参数化
- 喜马拉雅 xm文件转m4a_4K YouTube to MP3 Mac(YouTube转mp3软件)
- avenir字体可以商用吗_顶级公司的顶级logo设计原来用的这些字体!附字体下载...
- Diversity HDU - 6725
- Android应用程序消息处理机制(Looper、Handler)分析(5)
- shardedJedisPool工具类
- windows串口控制linux,是这个linux的串口配置与windows相同
- 毕业设计:舆情监测系统(SpringBoot+NLP)
- IAM:瑞策科技位列《全球区块链专利排行榜》第五位
- sql 恢复刚删除的表
- 静态资源压缩-nginx缓存问题
- 【行业视角】是什么让元宇宙土地与房产变得有价值
- usc week 5 计算几何(包含凸包) 队内练习题
- 把FIL放在哪里最值钱
- Tensorflow实战(三)——验证码识别(二)
- Python中的array[:]表示什么意思?记录一个幺蛾子
- 一个简单木马分析及接管利用
- 网络安全的守护神BackTrack Linux发行版
热门文章
- Windows7下Caffe的应用---在Win7下使用VS2015、Camke、Anaconda3配置Caffe CPU版本
- 【机器学习入门笔记3:OpenCV模块组织结构】20190203
- C语言不用文件系统读取文件,C语言-基础教程-非缓冲文件系统
- 不起作用 微信小程序 顶部json_微信小程序之 新建项目默认结构
- 才云开源 Nirvana:Golang REST API框架
- mysql创建用户以及授权
- rsync 服务与配置文档
- 设计一个健壮的大型文件下载系统
- 分卷压缩并解压 (线上服务器如何把很大的数据拷贝到另外一台服务器上)
- 微软Office Online服务安装部署及wopi代码实现--------Office Online服务器的安装