第六章 初始继承和多态

一:本章目标

①:理解继承的概念

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

③:访问修饰符

④:多态的概念

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

二:所谓继承:

在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();
        }
    }
时间: 2024-11-08 17:26:32

第六章 初始继承和多态的相关文章

初始继承和多态

一.子类与父类 1.子类:父类 例如: Dog(子类):Anomal(父类) 子类(派生类)父类(基类和超类) 2.子类可以继承父类那些成员 (非私有成员,但是从技术角度,可以认为是父类的所有成员) 软件系统中的两个类符合is a时可以使用继承 例如: student is a person se is a employee 鸵鸟(ostrish)is a bird(错误结论!!!) ☆:继承模式下子类构造背后到底发生了什么? 如果我们想构建一个子类对象 //在Animal父类中 class A

第六章:继承

1.构造器工作模式——原型链法: Child.prototype = new Parent();   //Child.prototype.constructor改变了,成为Parent Child.prototype.constructor = Child; 2.构造器工作模式——仅从原型链继承法(速度越快,不需要新建对象实例,不存在链,缺点:子对象修改会影响到父对象,此方法不好,最好不要使用) Child.prototype = Parent.prototype; Child.prototyp

C#本质论6.0第六章:继承

基类型与派生类型之间的转型: 显式转型与隐式转型: 从派生类型转型为基类型称为隐式转型,转型总会成功,不会引发异常. 从基类型转型为派生类型称为显式转型,在转型过程中可能会失败,为了执行显示转型,要在原始引用名称之前,将要转换成的类型放在前面圆括号中. 自定义转换: 不相关的类型之间也能进行相互转换,C#允许类型包含显式与隐式转型转换符,在转型有可能失败时,开发者应定义显式转型操作符. class GPSCoordinates { //... public static implicit ope

课堂笔记--初识继承和多态 继承

第六章 初始继承和多态 继承:一个类可以使用另一个类的属性和方法(成为该类的成员) 子类继承父类使用的符号是冒号 子类不能继承父类的构造方法 子类不能访问父类的私有字段和方法 在调用子类构造的时候,没有使用base关键字调用父类的指定构造,那么默认调用父类的无参构造. 定义一个Person类 class Person { public string Name { get; set; } public Gender Sex { get; set; } public void SayHello()

《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章  继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章将帮助你解决许多常见的.复杂的建模问题,并解决你可能在现实中遇到的建模问题. 本章以多对多关系开始,这个类型的关系,无论是在现存系统还是新项目的建模中都非常普遍.接下来,我们会了解自引用关系,并探索获取嵌套对象图的各种策略.最后,本章以继承的高级建模和实体条件结束. 6-1  获取多对多关联中的链接表 问题

3. 第一章:C#面向对象编程之继承和多态

第一章:C#面向对象编程 第二节:继承和多态 继承可以让class具有一种特殊的能力,即实现class本身定义的所有功能外,还可以对父类(或称为基类.超类)的某些属性和功能进行扩展,这样的类我们称之为子类(或派生类). 继承有如下的几个规则: 1. 可传递性: 如: C是B的子类,B是A的子类,那么C会同时继承B和A:(object为所有类的基类) 2. 唯扩展性: 子类应是对父类的扩展,而不能在子类除去父类里面的定义: 3. 构造函数和析构函数不能被继承: 除去构造函数和析构函数不能被继承,其

《Java从小白到大牛》之第12章 继承与多态

<Java从小白到大牛>纸质版已经上架了!!! 类的继承性是面向对象语言的基本特性,多态性前提是继承性.Java支持继承性和多态性.这一章讨论Java继承性和多态性. Java中的继承 {#java} 为了了解继承性,先看这样一个场景:一位面向对象的程序员小赵,在编程过程中需要描述和处理个人信息,于是定义了类Person,如下所示: //Person.java文件 package com.a51work6; import java.util.Date; public class Person

第10章 接口、继承与多态 抽象类和接口

一.抽象类 在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理.回想继承和多态原理,继承树中越是在上方的类越抽象,如:鸽子类继承鸟类.鸟类继承动物类等.在多态机制中,并不需要将父类初始化对象,我们需要的只是子类对象,所以在Java语言中设置抽象类不可以实例化对象,因为图形类不能抽象出任何一种具体图像,但它的子类却可以. 抽象类的语法如下:使用abstract关键字定义的类称为抽象类,而使用这个关键字定义的方法称为抽象方法,抽象方法没有方法体,这个方法本身没有任何意义,除

《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13  在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体,允许基类被实例化. 解决方案 假设你有如图6-20所示的模型. 图6-20 包含Invoice实体的模型 这个模型只包含一个单独的实体Invoice(发货单).我们想从Invoice派生一个新的实体,它表示删除掉的发货单.这将允许我们以更清晰的业务逻辑来分别对有效的发货单和已删除掉的发货进行不同的操作.按下面