1、什么是继承
为了能够合理描述自然界的规律,面向对象的编程中引入了继承的概念,它是面向对象编程中最重要的概念之一,定义了一个如何根据现有类创建出新类的过程。任何类都可以从另外一个类继承。继承遵循的原则是:一个派生出来的子类具有这个类所有的公共属性和方法。
c#提供了类的继承的机制,创建新类锁根据的基础称为基类或父类,新建的类则称为派生类或子类。面向对象编程中,继承遵循代码重用的原则,使用时可以不需要从头开始创建新类,可以在现有的基础上添加新的方法和属性,节约时间和精力,大大提高了效率。
继承中合理派生子类可以通过“是不是”的规则进行判断,也就是“is-a”关系,例如:猫是动物,狗是动物这样的一个关系。
当在类之间创爱你“is-a”关系是,也就在两个或者两个以上的类之间构建了依赖关系,经典的继承基本思想是新类可以利用既有类的功能。
2、继承的使用
1、创建两个新类Teacher和Student
2、创建一个新的类Person,提取Teacher和Student类中公共部分
3、删除Teacher和Student类中提取出的代码,保留各自独有的部分
4、实现继承,父类为Person,子类为Teacher和Student
下面是Teacher.cs代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OOP { public class Teacher { public string Name { get; set; } //姓名 public int Age { get; set; } //年龄 public string Gender { get; set; } //性别 public Teacher() { } //构造函数 //接收输入的方法 public void Accept() { Console.WriteLine("请输入你的姓名、年龄和性别"); this.Name = Console.ReadLine(); this.Age = Convert.ToInt32(Console.ReadLine()); this.Gender = Console.ReadLine(); Console.WriteLine("{0}是{1}性,年龄{2},在工作中",this.Name,this.Gender,this.Age); } //老师特有的方法:教书 public void Teach() { Console.WriteLine("老师正在教学"); } } }
下面是Student.cs代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OOP { public class Student { public string Name { get; set; } //姓名 public int Age { get; set; } //年龄 public string Gender { get; set; } //性别 public Student() { } //构造函数 //接收输入的方法 public void Accept() { Console.WriteLine("请输入你的姓名、年龄和性别"); this.Name = Console.ReadLine(); this.Age = Convert.ToInt32(Console.ReadLine()); this.Gender = Console.ReadLine(); Console.WriteLine("{0}是{1}性,年龄{2},在工作中",this.Name,this.Gender,this.Age); } //学生特有的方法:学习 public void Study() { Console.WriteLine("学生正在学习"); } } }
我们可以看到上面Teacher类和Student类中的代码,两个类都有共同的部分,现在我们就将他们共同的部分提出来,封装成一个类,这个提取出来的类叫做基类或父类,基类的作用是为了以后子类的扩展,而定义的所有公共数据以及成员。扩展类叫做派生类或子类。创建派生类的语法如下
<访问修饰符> class 派生类名:基类名 { //类的代码块 }
我们把提取出来的类命名为Person.cs 代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OOP { public class Person { public string Name { get; set; } //姓名 public int Age { get; set; } //年龄 public string Gender { get; set; } //性别 //接收输入的方法 public void Accept() { Console.WriteLine("请输入你的姓名、年龄和性别"); this.Name = Console.ReadLine(); this.Age = Convert.ToInt32(Console.ReadLine()); this.Gender = Console.ReadLine(); Console.WriteLine("{0}是{1}性,年龄{2},在工作中",this.Name,this.Gender,this.Age); } } }
现在我们可以删除Teacher和Student类的公共部分,并通过继承Person实现,代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OOP { public class Teacher:Person { //老师特有的方法:教书 public void Teach() { Console.WriteLine("老师正在教学"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OOP { public class Student : Person { //学生特有的方法:学习 public void Study() { Console.WriteLine("学生正在学习"); } } }
实现继承之后,我们看到代码少了很多而且可读性强,效率也高了。注意,虽然构造函数一般定义为公共的,但派生类从来没有继承父类的构造函数。一定要记住,继承保护了封装,它不能访问类的私有成员(包括父类和私有成员)。现在我们编写控制台程序控制一下,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OOP { class Program { static void Main(string[] args) { Teacher tea=new Teacher(); tea.Accept(); tea.Teach(); Student stu=new Student(); stu.Accept(); stu.Study(); Console.ReadKey(); } } }
运行结果如下:
未完待续。。。