C#每日一课(十七)

40 篇文章 1 订阅

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

编译运行后的结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值