一.继承
首先我们了解一下什么是继承,举个简单的例子,继承就是子类继承父类的属性比如你定义了一个汽车类,然后设置他的属性是四个轮子
你再定义一个小轿车类,继承汽车类,那他的属性就是四个轮子以及还有你要设置的别的属性。
1.继承分为父类和子类:
子类:派生类
父类:基类或者超类
2.什么条件的类可以使用继承??
满足is a关系的两个类可以使用继承。
例如:
学生 is a Person
继承的优点:
减少代码冗余,实现代码复用
具体例子如图所示:(用一个动物类(父类)和狗类(子类))
创建出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也不支持多继承)
五:实现多态
概念:不同的对象对于同一个操作,做出的响应不同,那么这种情况在面向对象编程中就称为多态。
使用多态的目的:为了统一调用。
实现多态的方式:
①:通过虚方法实现多态
实现多态的步骤:
(1).在父类中通过virtual关键字定义一个虚方法
(2).在子类中通过override关键字对父类中的虚方法进行重写
(3).调用的时候,调用的是子类的方法
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(); } }