类的继承

Posted zhangmawang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的继承相关的知识,希望对你有一定的参考价值。

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();
        }
    }
}

  运行结果如下:

技术分享图片

 

未完待续。。。

以上是关于类的继承的主要内容,如果未能解决你的问题,请参考以下文章

类的继承与派生

类的继承

用类的继承关系实现简易后台代码模板

python系统学习14类的继承与创新

静态代码块类的继承和接口

类的继承和多态细思