吃透面向对象核心:封装、继承、多态、接口全解
C#面向对象三大特性是编程核心重难点本文详细讲解访问权限修饰符、封装与属性、继承与sealed密封类、方法重写、base关键字、抽象类、接口、多态、类型转换及is/as关键字搭配完整实战代码零基础也能轻松掌握OOP核心用法搞定C#进阶必备知识点主要内容访问权限修饰符封装继承方法重写base关键字接口多态1.访问权限修饰符访问修饰符用于控制类、结构、接口、方法和属性、字段等的可见性public:公开的修饰类和类中的成员在整个解决方案中都可使用internal:内部的修饰类和类中的成员在整个项目中都可使用private:私有的修饰类的成员允许修饰内部类只能在类中使用protected:受保护的修饰类的成员只能在本类中生效也可以在子类包含子类的子类及跨项目的子类中生效2.面向对象三大特性-封装封装的主要目的是保护对象的数据不被随意修改、访问数据操作的细节只通过定义好的方法进行访问和操作。这样可以提高代码的安全性、可维护性和可灵活性。封装是一种将数据和操作数据的方法捆绑在一起并隐藏内部实现细节的机制1、隐藏内部状态将对象的字段设置为私有private这样外部代码不能直接访问这些字段。2、提供公共接口为对象提供公共方法public来操作内部数据这样外部代码可以通过这些公共方法间接访问和修改内部数据。3、封装的好处数据保护防止外部代码直接访问和修改对象的内部数据从而保护数据的一致性和完整性。易于维护当内部实现发生变化时只需要修改封装的方法不需要修改外部代码。属性 是一种特殊的成员用于封装类中的字段。它们提供了一种灵活的机制来读取get和/或写入set私有字段的值实现封装私有的字段通常以_开头其它遵循小驼峰命名法。公开的属性通常遵循大驼峰命名法。选中字段名Ctrl R E 快速生成get/set方法3.面向对象三大特性之一继承继承 是一种面向对象编程的核心特性它允许我们创建一个新类称为子类或派生类基于另一个已存在的类称为基类或父类。通过继承子类可以继承基类的属性fields和方法methods并且可以添加新的属性、方法或覆盖override基类的成员。如果多个类中存在相同的方法、属性则可以考虑将相同方法、属性抽取到父类中再通过继承关系子类对象可以直接调用父类中的属性、方法进而可以避免反复编写相同逻辑的代码。实现代码复用和层次化设计语法格式class A : B{}A类 继承 B类A类可以直接使用B类中可以被继承的属性和方法。父类中应根据职责封装子类共有的属性和方法。C#中为单继承只能有一个直接父类。在C#中一个类可以被声明为sealed密封类这意味着它不能被继承。4.方法重写方法重写Override是面向对象编程中的一个核心概念当从父类中继承的方法不能满足子类的需求子类可以重写替换从基类中继承来的方法。virtual修饰方法虚空方法特点子类可以重写也可以不重写override修饰方法重写后的方法特点重写后的方法允许子类再进行重写new修饰方法隐藏父类中继承的方法特点子类中定义了和父类中相同的方法使用new隐藏父类中继承的方法abstract修饰方法、类抽象方法1.子类必须重写父类中的抽象方法要么子类也为抽象类2.抽象方法必须定义在抽象类中### 方法重写与方法重载英文位置不同作用不同重载overload同一个类中在一个类里面的一种行为方法名可以相同提高可读性可维护性。。重写override子类和父类间父类方法无法满足子类的要求子类通过方法重写满足要求。5.base关键字指向子类对象中从父类中继承的成员this.xxx先使用子类中的子类中没有再使用父类中继承的base.xxx使用父类中继承的子类中成员和父类中成员同名时base.成员名调用父类中成员子类构造方法:base(xxx)创建子类对象在堆空间中申请空间该空间中1.存储子类的字段、属性、方法。2.存储父类中继承的字段、属性、方法。this与base关键字的区别this用于引用当前类的实例对象。可以通过this关键字来访问当前对象的成员。每个实例方法都有一个隐式的this参数该参数指向当前实例。this访问的成员在本类中没有时才访问父类中继承的成员。base通过base关键字来访问父类对象中的成员。base关键字并不是父类对象的引用而是一种用于访问基类成员的语法。它允许在派生类中访问基类的构造函数、方法和属性等。6.接口1. 介绍接口Interface是一种定义规范而不是定义行为具体的实现引用类型。它用于定义一组方法、属性、事件或索引器的契约。接口本身不提供实现而是由实现接口的类来提供具体实现。接口定义中只包含属性、方法等的声明而没有实际的方法实现或字段。可以把一个接口看做是一组公共的属性和方法的规范。由于C#中类的继承是单继承的接口为多继承在某些方面可以弥补单继承的不足。2. 特点接口存在的意义就是制定规范。接口没有构造函数不能创建对象。接口中属性方法不允许添加访问权限修饰符默认为public。接口与接口之间可以多继承。类与接口之间可以多实现。实现类实现了接口后必须将接口中所有抽象方法都实现。3. 使用原则接口使用interface关键字声明它与类的声明类似。接口声明默认是 public 的。按照约定接口名称以大写字母I开头。接口中的属性是隐式public。接口中的方法隐式为public公开 abstract(抽象类)。4. 语法格式4.1 定义接口[public | internal] interface 接口名{返回值类型 方法名([形参列表]);}internal interface IMyInterface { void Play(); }4.2 实现接口一个类可以实现一个或多个接口。4.2.1 实现一个接口[public | internal] class 类名 : 接口名{返回值类型 方法名([形参列表]){}}internal interface IMyInterface { void Play(); } class MyClass : IMyInterface { public void Play() { } }7.多态面向对象三大特征之一多态。调用同一个父类|接口中的方法由于子类|实现类不同可能会有不同的行为。以**继承继承类|实现实现接口**为前提。多态 可以 增加代码的灵活度。是调用方法的技巧不会影响到类|接口的内部设计。使用多态创建对象父类型|接口类型 对象名1 new 子类型|实现类型();Person person new Zs();类型转型方式1子类型|实现类型 对象名2 (子类型|实现类)对象名1;Zs zs1 (Zs)person;方式2子类型|实现类型 对象名3 对象名1 as 子类型|实现类型;as关键字 用于将一个对象强制转换为指定的类型。Zs zs2 person as Zs;is 关键字is关键字 主要作用是进行类型检查判断一个对象是否属于某个类型。使用is关键字可以增加代码的安全性。bool 变量名 对象名 is 类型;Person person new Zs(); if (person is Zs) { Zs zs2 person as Zs; Zs zs1 (Zs)person; }5.4 as 和 is 区别is操作符主要用于检查一个表达式的类型是否与指定的类型兼容而as操作符主要用于将一个对象强制转换为指定的类型。