C#每日一课(十七)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/advent86/article/details/83305606

C# 继承

继承,它允许根据一个类来定义另一个类,这样使得创建和维护程序变得相对容易,同样也有利于代码的重用。

在创建一个类时,不需要完全重新编写新的数据成员和成员函数,只需要设计一个新类,这个新类继承已有类即可。这个已有类叫做基类,新生成的类叫做派生类。

继承的思想是实现了属于(is-a)的关系。

 

基类和派生类

一个派生类只能有一个直接基类,但一个基类可以有多个直接派生类。

继承是可以传递的,定义要从其他类派生的类时,派生类会隐式获得基类的所有成员(这些成员不包含构造函数和析构函数)。派生类因而可以重用基类中的代码,而无需重新实现。在派生类中,可以再自行去添加更多成员,这样派生类就扩展了基类的功能。

C#创建派生类的语法:

<access_specifier> class <base_class>

{

……

}

class <derived_class>:<base_class>

{

……

}

使用Visual Studio新建项目:chapter12_001

新建一个Person类:

class Person

    {

        protected long id;  //身份ID

        protected string name;  //姓名



        public void setId(long id)

        {

            this.id = id;

        }



        public void setName(string name)

        {

            this.name = name;

        }

 }

新建一个Student类,这个类从Person类继承而来

class Student:Person

    {

        public void Display()

        {

            Console.WriteLine("ID:{0};name:{1}",id,name);

        }

}

在有IDE生成的类中的Main方法中添加如下代码

Student stu = new Student();

      stu.setId(100001);

      stu.setName("xiesheng");



      stu.Display();

  Console.ReadKey();

编译运行后的结果如下:

 

基类的初始化:

派生类新继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。可以在成员初始化列表中进行父类的初始化。

在Person类中新增构造函数:

//Perosn构造函数

    public Person(long id, string name)

    {

        this.id = id;

        this.name = name;

}

在子类中需要使用初始化列表来进么初始化,Student类改造后如下

class Student:Person

    {

        private string school;

        public Student(long id, string name, string school) : base(id, name)

        {

            this.school = school;

        }

        public void Display()

        {

            Console.WriteLine("ID:{0};name:{1};school:{2}",id,name,school);

        }

 }

IDE生成类中的Main方法改造为如下:

Student stu = new Student(100001, "xiesheng","西安交通大学");

           

    stu.Display();

Console.ReadKey();

编译运行后的结果如下:

 

C#中多重继承:

C#不支持多重继承,但是,可以通过使用接口来实现多重继承。

在工程中新增接口interface

interface exam

{

     string getGrade(double en,double hn,double po);

}

Student继承这个接口,则需要对接口中的方法进行实现

改造Student类如下:

class Student:Person,exam

    {

        private string school;

        private string grade;

        public Student(long id, string name, string school) : base(id, name)

        {

            this.school = school;

        }

        public void  steGrad(string grade)

        {

            this.grade = grade;

        }

        public void Display()

        {

            Console.WriteLine("ID:{0};name:{1};school:{2}",id,name,school);

            Console.WriteLine("考试结果:{0}", grade);

        }



        //对接口实现

        public string getGrade(double en, double hn, double po)

        {

            if (en < 60 || hn < 60 || po < 60)

            {

                return "Fail";

            }

            else

            {

                return "Pass";

            }

        }

   }

在IDE生成的Main方法做如下测试调用:

Student stu = new Student(100001, "xiesheng","西安交通大学");

    stu.steGrad(stu.getGrade(60.1, 90.5, 60.0));

    stu.Display();

Console.ReadKey();

编译运行后的结果如下:

猜你喜欢

转载自blog.csdn.net/advent86/article/details/83305606