初始继承和多态 三(补充)
一:本章目标
①:理解继承的概念
②:使用继承建立父类和子类以及继承的传递性、单根性
③:访问修饰符
④:多态的概念
⑤:会使用虚方法实现多态
二:所谓继承:
在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();
}
}