当前位置: 首页 > news >正文

06章 初始继承和多态

一:本章目标

①:理解继承的概念

②:使用继承建立父类和子类以及继承的传递性、单根性

③:访问修饰符

④:多态的概念

⑤:会使用虚方法实现多态

 

二:所谓继承:

C#中,如果一个类后面通过冒号又跟了另外一个类,那么我们就称冒号前面的类为子类,冒号后面的类为父类。这种书写类的方式放映出来的关系就称为类的继承关系。

 

1、子类:派生类

父类:基类或者超类

2、满足什么条件的类可以使用继承??

满足is a关系的两个类可以使用继承。

例如:

 

     经理is a a 员工

 

     程序员  is a 员工

 

     学生 is  a Person

 


继承的优点:减少代码冗余,实现代码复用

 

☆继承模式下子类构造,背后到底发生了什么???

eg:

创建出Animal(父类)、Dog(子类)

关键代码如下:

父类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Chap06
{
    public class Animal
    {
        //定义自动属性 年龄和姓名
        public int Age { get; set; }

        public string Name { get; set; }

        //无参构造
        public Animal()
        { 
        
        }

        //带参构造
        public Animal(int age,string name)
        {
            this.Age = age;
            this.Name = name;
        }
    
    }
}

子类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Chap06
{
  public  class Dog:Animal
    {

        public string Color{ get; set; }

        //无参构造
        public Dog()
        { 
        
        }
        //带参构造
        public Dog(int age,string name,string color)
        {
            this.Age = age;
            this.Name = name;
            this.Color = color;
        
        }

        public void Eat()
        {
            Console.WriteLine("Dog Eat Meat Very Happy!");
           
        }
    }
}

Main方法:

namespace Chap06
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建Dog对象
            Dog dog = new Dog();
            //调用子类中的Eat()方法
            dog.Eat();

            Console.ReadKey();


        }
    }
}

解析:

如果我们想构建一个子类对象...

1、进入子类构造方法名,但不进入子类构造的方法体

2、跳转到父类构造方法名,接下来执行父类构造的方法体

3、父类方法体执行完毕,跳转到子类方法体执行

4、子类方法体执行完毕,跳转到Main函数,代表子类对象创建过程

 

 

注:继承关系在类图中表示为一个箭头,箭头指向的是父类。

子类可以继承父类的非私有成员

一个子类只能有一个直接父类

子类构造默认会调用父类的无参构造

三:base关键字

解析:

①:父类的实例

②:看成是调用父类的构造,只出现在子类构造后面

③:base(参数列表)父类带参构造的参数列表一致

④:相当于方法调用,不带有数据类型

 

四:访问修饰符

①:Public:任何位置都能访问(方法,成员变量,类)

②:Private:只能当前类自身访问,出了类所在{}无法访问(方法,成员变量)

③:Protected:当前类和子类能访问及子类的子类(孙子类)(方法以及变量)

④:Internal:只能在当前程序集中使用

三种访问修饰符对类成员的访问限制强度:Private>Protected>Public

五:继承的特性:

①:传递性:

如果一个类B继承自类A,而类C又继承类B,那么类C也可以访问到类A中非私有成员

 

②:单根性C#不支持多继承 Java也不支持多继承)

 

 

六:继承的价值

01.模拟现实世界的关系

02.便于重用和扩展已彻底测试的代码,且无需修改

03.结构更清晰

七:实现多态

概念:

不同的对象对于同一个操作,做出的响应不同,那么这种情况在面向对象编程中就称为多态。

使用多态的目的:

使用多态就是为了统一调用。

实现多态的方式:

①:通过虚方法:

实现多态的步骤:

01.在父类中通过virtual关键字定义一个虚方法

02.在子类中通过override关键字对父类中的虚方法进行重写

03.调用的时候,调用的是子类的方法

 

Main方法进行创建对象以及遍历集合:

namespace Chap06多态
{
    class Program
    {
        static void Main(string[] args)
        {
            Chinese chinese = new Chinese();

            American american = new American();

            Korea korea = new Korea();

            Person[] p =
            {
            chinese,american,korea
            
        };
            //遍历集合中的元素,调用对应子类中的Hello方法
            foreach (Person item in p)
            {
                item.Hello();
            }
            Console.ReadLine();
        }
    }

 

转载于:https://www.cnblogs.com/WJ-163/p/5375784.html

相关文章:

  • Paragon NTFS for Mac® Yosemite - 免费下载
  • 全栈工程师的未来发展如何?
  • Linux内核分析8
  • CentOS 7.x设置自定义开机启动,添加自定义系统服务
  • linux中萌翻了的cowsay命令
  • UVA 10129 Play on Words (欧拉通路)
  • 数据库 -- SQL 和 NoSQL 的区别
  • 进度条(第七周)
  • JAVA中十四种常见开发工具及其特点
  • spring Thymeleaf 中文乱码 (转)
  • BZOJ4380: [POI2015]Myjnie
  • iOS开发经验总结
  • 人机交互——对搜狗输入法的评价
  • cocos2d-x-3.0 的改变,由于变得太多,一点点累积吧!
  • ThinkPHP函数详解系列
  • 分享的文章《人生如棋》
  • 【面试系列】之二:关于js原型
  • Hibernate【inverse和cascade属性】知识要点
  • Iterator 和 for...of 循环
  • PAT A1092
  • Redis字符串类型内部编码剖析
  • SQLServer插入数据
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 来,膜拜下android roadmap,强大的执行力
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 微信小程序--------语音识别(前端自己也能玩)
  • 微信支付JSAPI,实测!终极方案
  • 智能合约开发环境搭建及Hello World合约
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​批处理文件中的errorlevel用法
  • !$boo在php中什么意思,php前戏
  • #stm32整理(一)flash读写
  • (pytorch进阶之路)扩散概率模型
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (八)c52学习之旅-中断实验
  • (待修改)PyG安装步骤
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (十六)串口UART
  • (算法)Travel Information Center
  • (转)Windows2003安全设置/维护
  • ***监测系统的构建(chkrootkit )
  • .Net IE10 _doPostBack 未定义
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET6 命令行启动及发布单个Exe文件
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [] 与 [[]], -gt 与 > 的比较
  • [1204 寻找子串位置] 解题报告
  • [AIGC] 如何建立和优化你的工作流?
  • [autojs]逍遥模拟器和vscode对接