CS3L18——多态vob
CS3L18——多态vob
本章代码关键字
123virtual //使用 virtual 修饰的方法,在子类里可以通过 override 去重写override //重写父类 virtual 修饰的方法的关键字base //在重写方法中调用父类方法的关键字
多态
多态就是按字面的意思就是“多种状态”,让继承同一父类的子类们,在执行相同方法是有不同的表现
主要目的:同一父类的对象 执行相同行为(方法)有不同的表现
多态要解决的问题:让同一个对象有唯一行为的特征
以前没有学习多态相关关键字时,要在子类重写一个父类方法需要使用 new 关键字
但是 new 关键字在 里氏替换情况下,会出现问题,例如下面的代码:
123456789101112131415161718192021222324class Father{ public void SpeakName() { Console.WriteLine("Father的方法"); }}class Son : Fa ...
CS3L17——密封类
CS3L17——密封类
本章代码关键字
1sealed //密封关键字修饰的类,无法再被继承
密封类
密封类,是使用 sealed 密封关键字修饰的类,它的作用是:让类无法再继承
在面向对象程序的设计中,密封类的主要作用就是不允许最底层子类被继承,
可以保证程序的规范性,安全性,未来在制作复杂系统和程序框架时,密封的作用会显现出来。
示例
1234567891011121314class Father{}sealed class Son : Father{ //使用了sealed关键字的类不能被继承}//下面的类就无法继承密封类//class Test : Son//{//}
CS3L16——万物之父和装箱拆箱
CS3L16——万物之父和装箱拆箱
本章代码关键字
1object //所有类型(包括值类型)的基类,它是一个类(引用类型)
万物之父 object
关键字:object,object 是所有类型(包括值类型)的基类,它是一个类(引用类型)
基于里氏替换原则,可以用 object 容器装载一切类型的变量
作用:
可以利用里氏替换原则,用 object 装任意类型对象
可以用来表示不确定类型,作为函数参数类型
用 object 存储值类型(装箱),将 object 转为值类型(拆箱),存在拆箱装箱
好处:不确定类型时可以方便参数的存储和传递
坏处:存在内存迁移,增加性能消耗
因为装箱拆箱有性能损耗,所以最好慎用
object 自带了一些方法,详见:CS3L23——object中的方法
万物之父的使用
object 是所有类型的基类,包括所有值类型和引用类型
将 object 类型转换为其他类型时,可以使用 as 也可以使用括号强转,引用类型建议使用 as,值类型需要使用括号强转
12345678910111213141516171819202122 ...
CS3L15——继承中的构造函数
CS3L15——继承中的构造函数
本章代码关键字
12this //代表类自己的构造函数base //代表父类的构造函数
继承中的构造函数
特点:当实例化一个子类对象时,执行顺序是先执行父类的构造函数 再执行子类的 从最开始的基类开始 依次一代一代向下执行
注意!父类的无参构造很重要,子类构造函数默认会调用父类无参构造函数
子类的构造函数必须要调用父类的一个构造函数,子类可以通过 base 关键字 来指定调用父类的某个构造函数
注意要区分 base 和 this 的区别,base 是基类的构造函数,而 this 是类自己的构造函数
继承中构造函数的执行顺序
父类的父类的构造 ——> … 父类构造 ——> … ——> 子类构造
123456789101112131415161718192021222324252627282930class GameObject{ public GameObject() { Console.WriteLine("GameObject的构造函数"); ...
CS3L14——里氏替换原则
CS3L14——里氏替换原则
里氏替换原则
里氏替换原则是面向对象七大原则中最重要的原则
概念:任何父类出现的地方,子类都可以替代
重点:语法表现为父类容器装子类对象,因为子类对象包含了父类的所有内容
作用:方便进行对象存储和管理
里氏替换原则的意义是:让我们不需要关心子类的实现,只管调用父类声明好的成员即可,它需要配合后续的 多态 才会展现出意义所在
基本实现
注意!用父类容器装载的子类对象不能直接调用子类里的成员方法,如果要使用子类的方法就需要用到 is 和 as
123456789101112131415161718192021222324252627282930313233343536class GameObject { }class Player : GameObject{ public void PlayerAtk() { Console.WriteLine("怪物攻击"); }}class Monster : GameObject{ ...
CS3L13——继承的基本规则
CS3L13——继承的基本规则
继承
一个类A 可以继承 另一个类B,继承的类A 会继承 被继承的类B 的所有成员,继承的类A 会拥有 被继承的类B 的所有特征和行为
被继承的类可以称为:父类、基类、超类
继承的类可以称为:子类、派生类
子类可以有自己的特征和行为
特点
单根性:C#的子类只能有一个父类
传递性:子类可以间接继承父类的父类
继承基本语法
1234class 类名 : 被继承的类名{ }
访问修饰符的影响
public - 公共 内外部访问
private - 私有 内部访问
protected - 保护 内部和子类访问
在命名空间讲到:
internal - 内部的 只有在同一个项目程序集的文件中,内部类型或者是成员才可以访问
继承使用实例
如果与基类的成员重名会导致基类的成员被隐藏,这不是好的写法,
如果有意覆盖需要在变量类型前加上 new,但即使这样也不建议这样写,这种写法仍然不好
12345678910111213141516171819202122232425262728293031323334353637 ...
CS3L12——内部类和分部类
CS3L12——内部类和分部类
本章代码关键字
1partial //partial可以分部描述一个类,增加程序的拓展性,也可以分部方法,可以将方法的声明和实现分离
内部类
在一个类中再申明一个类,特点:使用时要用包裹者点出自己,作用:亲密关系的变现
注意:访问修饰符作用很大,使用内部类时,需要 public 才能使外部能使用它
1234567891011121314151617181920212223242526class Person{ public int age; public string name; public Body body; public class Body { Arm leftArm; Arm rightArm; //注意 使用内部类时,需要public才能使外部能使用它 public class Arm { } }}internal class Progra ...
CS3L11——运算符重载
CS3L11——运算符重载
本章代码关键字
1operator //运算符重载关键字
运算符重载
让自定义类和结构体,能够使用运算符,使用关键字 operator
特点:一定是一个公共的静态方法,返回值写在 operator 前,逻辑处理自定义
作用:使自定义类和结构体对象可以进行运算
注意:条件运算符需要成对实现,一个符号可以多个重载,不能使用 ref 和 out
运算符重载声明语法和使用
基本语法:
1public static 返回类型 operator 运算符(参数列表)
声明和使用示例
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748class Point{ public int x; public int y; //注意 运算符重载的两个参数的类型 至少要有一个 是当前所在的类,例如,两个参数类型都是int这种情况就不允许 public static Point operator +(Poi ...
CS3L10——拓展方法
CS3L10——拓展方法
拓展方法
拓展方法可以为现有的 非静态变量类型 添加 新办法
作用:
提升代码拓展性
不需要在在对象中重新写办法
不需要继承来添加方法
为别人封装的类型写额外的方法
特点:
一定是写在静态类中
一定是个静态函数
第一个参数为拓展目标
第一个参数用 this 修饰
拓展方法可以有返回值 和 n 个参数根据需求而定
基本语法
1访问修饰符 static 返回值 函数名(this 被拓展的类名 参数名, 参数类型 参数名, 参数类型 参数名,...) { }
拓展示例
假设要为 int 和 string 拓展一个成员方法,成员方法 是需要 实例化对象后 才能使用的,
第一个参数 是规定为了哪一个非静态的变量类型添加拓展方法,使用这个方法的是 哪个对象
12345678910111213141516171819202122232425262728static class Tools{ //value 代表 使用该方法的实例化对象 //第一个参数 是规定为了哪一个非静态的变量类型添加拓展方法,使用这个方法的是 哪个 ...
CS3L9——静态类和静态构造函数
CS3L9——静态类和静态构造函数
静态类
概念:用 static 修饰的类
特点:只能包含静态成员,不能实例化
作用:将常用的静态成员写在静态类中,方便使用,
静态类不能被实例化 更能体现工具类的唯一性,比如 Console 就是一个静态类
静态类适合用来做工具类
123456789static class Tools{ //静态成员变量 public static int testIndex = 0; //静态成员函数 public static void TestFun() { } public static int TestIndex { get; set; }}
静态构造函数
概念:用 static 修饰的构造函数
特点
静态类和普通类都可以有静态构造函数,它不能用访问修饰符,不能有参数,只会自动调用一次
静态构造函数在第一次调用类的内容时就会自动调用执行
作用:在静态构造函数中初始化静态变量
1234567891011121314151617181920212 ...