CS3L19——抽象类和抽象方法
CS3L19——抽象类和抽象方法 本章代码关键字 1abstract //抽象类和抽象方法的关键字 抽象类 抽象类就是,被抽象关键字 abstract 修饰的类 特点:不能被实例化的类,可以包含抽象方法,继承抽象类必须重写其抽象方法 作用:整体框架设计时会使用 注意:选择普通类还是抽象类,对于不希望被实例化的对象,相对比较抽象的类可以使用抽象类 父类中的行为不太需要被实现的,只希望在子类去定义具体的规则,可以选择,抽象类然后使用其中的抽象方法类定义规则 12345678910111213141516171819// 物品就是一种抽象的概念,它不是具体的物质,而是一个统称abstract class Thing{ //抽象类中 封装的所有知识点都可以在其中书写 public string name; //还可以抽象类中写抽象函数}class Water : Thing { }internal class Program{ static void Main(string[] args) ...
CS3L18——多态vob
CS3L18——多态vob 本章代码关键字 123virtual //使用 virtual 修饰的方法,在子类里可以通过 override 去重写override //重写父类 virtual 修饰的方法的关键字base //在重写方法中调用父类方法的关键字 多态 多态就是按字面的意思就是“多种状态”,让继承同一父类的子类们,在执行相同方法是有不同的表现 主要目的:同一父类的对象 执行相同行为(方法)有不同的表现 多态要解决的问题:让同一个对象有唯一行为的特征 以前没有学习多态相关关键字时,要在子类重写一个父类方法需要使用 new 关键字 但是 new 关键字在 里氏替换情况下,会出现问题,例如下面的代码: 123456789101112131415161718192021222324class Father{ public void SpeakName() { Console.WriteLine("Father的方法"); }}class Son...
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 也可以使用括号强转,引用类型建议使用...
CS3L15——继承中的构造函数
CS3L15——继承中的构造函数 本章代码关键字 12this //代表类自己的构造函数base //代表父类的构造函数 继承中的构造函数 特点:当实例化一个子类对象时,执行顺序是先执行父类的构造函数 再执行子类的 从最开始的基类开始 依次一代一代向下执行 注意!父类的无参构造很重要,子类构造函数默认会调用父类无参构造函数 子类的构造函数必须要调用父类的一个构造函数,子类可以通过 base 关键字 来指定调用父类的某个构造函数 注意要区分 base 和 this 的区别,base 是基类的构造函数,而 this 是类自己的构造函数 继承中构造函数的执行顺序 父类的父类的构造 ——> … 父类构造 ——> … ——> 子类构造 123456789101112131415161718192021222324252627282930class GameObject{ public 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 - 内部的 只有在同一个项目程序集的文件中,内部类型或者是成员才可以访问 继承使用实例 如果与基类的成员重名会导致基类的成员被隐藏,这不是好的写法, 如果有意覆盖需要在变量类型前加上...
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...
CS3L11——运算符重载
CS3L11——运算符重载 本章代码关键字 1operator //运算符重载关键字 运算符重载 让自定义类和结构体,能够使用运算符,使用关键字 operator 特点:一定是一个公共的静态方法,返回值写在 operator 前,逻辑处理自定义 作用:使自定义类和结构体对象可以进行运算 注意:条件运算符需要成对实现,一个符号可以多个重载,不能使用 ref 和 out 运算符重载声明语法和使用 基本语法: 1public static 返回类型 operator 运算符(参数列表) 声明和使用示例 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748class Point{ public int x; public int y; //注意 运算符重载的两个参数的类型 至少要有一个 是当前所在的类,例如,两个参数类型都是int这种情况就不允许 public static Point operator...
CS3L10——拓展方法
CS3L10——拓展方法 拓展方法 拓展方法可以为现有的 非静态变量类型 添加 新办法 作用: 提升代码拓展性 不需要在在对象中重新写办法 不需要继承来添加方法 为别人封装的类型写额外的方法 特点: 一定是写在静态类中 一定是个静态函数 第一个参数为拓展目标 第一个参数用 this 修饰 拓展方法可以有返回值 和 n 个参数根据需求而定 基本语法 1访问修饰符 static 返回值 函数名(this 被拓展的类名 参数名, 参数类型 参数名, 参数类型 参数名,...) { } 拓展示例 假设要为 int 和 string 拓展一个成员方法,成员方法 是需要 实例化对象后 才能使用的, 第一个参数 是规定为了哪一个非静态的变量类型添加拓展方法,使用这个方法的是 哪个对象 12345678910111213141516171819202122232425262728static class Tools{ //value 代表 使用该方法的实例化对象 //第一个参数...