class是一种引用类型
每一个类是一种自定义的引用类型
类的构造器
详见方法章节-构造器方法
在C#中,堆内存中的一个实例对象没有被任何变量访问时,会自动被垃圾收集器收集处理
扩展内容
类的析构器(待续)
如果类的对象调用了一些系统底层的资源,垃圾收集器自动处理垃圾时,不会释放这部分系统资源,此时就需要析构器去释放这部分资源
类似默认构造器,但把public换成波浪线~
类与反射机制(待续)
“在使用反射机制时,可以充分展现类作为类型type的一面”(待续)
dynamic编程(待续)
类的声明
类可以是声明在命名空间中,也可以声明在其他类的类体中(作为成员类)
在C#于JAVA中,声明与定义是合在一起的,声明就是定义
(扩展)C++中的类
但在C++中,声明和定义一般是分开的
类的声明在.h文件中
类的定义在.cpp文件中
类的成员方法也是声明与定义分开,在.h中声明,在.cpp中定义
.cpp文件开头需要引用对应的.h头文件
声明与定义和在一起时,都写在.h文件中(待续)
类声明的修饰符
编程规范:类的名称遵循大驼峰
访问级别修饰符
除public、private、protected外
还有internal,意为在项目project级别中自由访问
一个项目的编译结果为一个Assembly(装配集、程序集)
装配集一般有两种,可执行程序.exe和类库.dll
在VS中点击项目可调整程序的输出结果
总结
Public > protect || internal > private
VS中不写修饰符时,定义类的默认访问等级为internal
定义类的成员的访问等级默认为private
类的继承
声明继承类的语法:
声明类时在后面加上冒号: 和基类名
用语解释:
父类 = 基类
子类 = 派生类
.net的类型是单根的,所有的类型都是从Object类派生来的
object类是C#中所有类的基类,而object类是没有基类的
“是一个”与is操作符
一个子类的实例,语意上也是父类的一个实例
所以is可根据继承关系链判断一个实例是否为一个类型
特仑苏 is 牛奶 真
牛奶 is 特仑苏 假(语意上不一定是)
(EX)由此,一个父类类型的变量可以引用一个子类类型的实例!!!
牛奶变量,可以装特仑苏
交通工具变量,可以装汽车
封闭类修饰符sealed
在定义类时加上sealed修饰符,使类成为封闭类
封闭类(最终类)无法成为其他类的父类,无法在派生新类,是继承链条的末端(绝育())
C#中,一个类最多只能由一个基类
C++中,一个类可以有多个基类,但因此会产生“菱形继承问题”
子类的访问级别,不能超过父类,父类是internal,子类不能是public
继承的本质
继承的本质是派生类在基类已有的成员的基础上,对基类进行的横向和纵向上的扩展。
继承的性质
1.全盘继承性
子类对父类的成员全盘继承(除了类的构造器)
2.继承单调性
在派生与基础的过程中,进行的是扩展(单调增),类成员只能在继承过程中越来越多,不能越来越少
一个类一旦被引入继承链,就只能一直向下传递
(继承单调性是C++、JAVA、C#静态类型语言的特征)
横向扩展
类成员在数量上的扩充
纵向扩展
不增加类成员的数量,但对某个或某些类成员的版本进行扩充
如重写override(待续)
查看定义快捷键:F12、ctrl+点击
返回快捷键:ctrl + 减号
继承与构造器
当构造子类对象时,父类的构造器也会被调用
从高到低依次调用构造器
如图,当调用car的构造器car()时,会自然调用其父类vehicle 的构造器 vehicle(string owner)
而自定义了带参数构造器后,编译器就不再准备不带参数的默认构造器
此时编译器发现无法正确调用基类的构造器,因为缺少其构造器参数
解决方法1:
在子类中写上 : base(xxx),给其父类传递一个常量作为参数,把坑填上
解决方法2:
干脆直接也给子类的构造器添加一个与父类构造器一样的参数
说明父类的实例构造器,是不被子类继承的!
实例构造器不继承
reference:引用
面向对象第一原则:封装
父类的私有成员
子类中无法访问父类的private成员
但子类的继承了这个成员的,只是无法访问
父类中用属性封装私有字段,留下访问方法get
子类中可以直接调用访问方法,因为子类实际上的继承了父类的私有字段的,只是无法访问
编程规范:_XXX下划线+变量名表示私有字段,这个习惯来自C++和JAVA
C#、JAVA、C++使用的是“基于类的”面向对象实现
JavaScript使用的是“基于原型”的面向对象实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!