当前位置:编程学习 > C#/ASP.NET >>

浅谈C#中的实现继承

C#中的继承分为实现继承和接口继承,今天主要谈一下实现继承。

  实现继承表示一个类型派生于另一个基类型,该类型拥有基类型的所有成员字段和函数。在实现继承中,派生类型的每个函数采用基类型的实现代码。——摘自《C#高级编程第六版》92页

  为什么要使用类继承呢,举个小例子,假如说我们之前有个类叫Peoplo(人类),他具有身高、体重等属性,同时还具有吃饭、睡觉等方法,可是由于科技的进步人们又发明了机器人(Robot),它不但可以像人类那样具有身高、体重,还能够吃饭、睡觉外,它还具备人类所不具备的功能,例如机器人可以下潜到1000以下的深水中,如果没有继承,我们在定义Robot这个类的时候就得重复定义peoplo的成员和Robot所独特的成员,增加了我们的负担,使用继承就可以很好的解决这个问题,如下:

  先看Peoplo类
 1public class Peoplo
 2{
 3    public int stature { get; set; }//身高
 4    public int avoirdupois { get; set; }//体重
 5    public Peoplo()
 6    {
 7        //
 8        //TODO: 在此处添加构造函数逻辑
 9        //
10    }
11    public string dining()//吃饭
12    {
13        return "今天的红烧肉真好吃!";
14    }
15    public string dreamland()//睡觉
16    {
17        return "为什么不是席梦思的床垫呢?";
18    }
19}

该类定义了stature和avoirdupois两个属性,dining和dreanland两个方法。
再来看一下Robot类
 

 

 1public class Robot:Peoplo
 2{
 3    public Robot()
 4    {
 5        //
 6        //TODO: 在此处添加构造函数逻辑
 7        //
 8    }
 9    public string dive()
10    {
11        return " 已经下潜到999米了,马上就要到1000米勒!";
12    }
13}
 

我想有必要先搞清楚什么是基类,Robot由Peoplo派生而来,那么Robot就是派生类而Peoplo就是基类,也可以这么说Robot 是Peoplo的派生类,Peoplo是Robot的基类。

  下面我们使用Robot rb=new Robot(),这样我们得到了一个Robot类型的对象rb,那么rb都具备什么成员呢,没错,由于Robot继承了Peoplo类。所以它具备以下成员:stature和avoirdupois两个属性,dining和dreanland两个方法,还有就是自身的dive()方法。我们创建一个Default.aspx页面来输出结果验证一下。
 1public partial class _4_Default : System.Web.UI.Page
2{
3       Robot rb = new Robot();
4
5    protected void Page_Load(object sender, EventArgs e)
6    {
7       Response.Write(rb.dining());
8    }
9}

运行结果:今天的红烧肉真好吃! 

额的神啊,机器人怎么开始吃肉了啊,科技再进步机器人也无法吃肉啊,看来Peoplo类中的属性和方法不一定都适用于Robot啊,人类吃肉是用来补充能量,而机器人用什么补充能量呢,没错,电!看来我们有必要在Robot类中重新定义吃饭这个动作了,有人可能会说我们可以在定义一个RotboDining()方法,其实大可不必!我们只需改造一下Robot和Peoplo类就可以了,如下所示
 1public class Peoplo
 2{
 3    public int stature { get; set; }//身高
 4    public int avoirdupois { get; set; }//体重
 5    public Peoplo()
 6    {
 7        //
 8        //TODO: 在此处添加构造函数逻辑
 9        //
10    }
11    public virtual string dining()//吃饭
12    {
13        return "今天的红烧肉真好吃!";
14    }
15    public string dreamland()//睡觉
16    {
17        return "为什么不是席梦思的床垫呢?";
18    }
19}

改造后的Peoplo和原来的没什么大的变化,只不过是dining()多了一个virtual关键字,它的作用是什么呢?稍后你就知道了。再来看一下改造后的Robot类,如下所示。
 

 

 
1public class Robot:Peoplo
 2{
 3    public Robot()
 4    {
 5        //
 6        //TODO: 在此处添加构造函数逻辑
 7        //
 8    }
 9    public string dive()
10    {
11        return " 已经下潜到999米了,马上就要到1000米勒!";
12    }
13    public override string dining()
14    {
15        return "别让俺干活,俺在充电中!";
16    }
17}

我们发现改造后的Robot类中多了一个public override string dining()方法,这个方法与基类Peoplo中的dinind()方法签名一模一样,而且前面还有一个关键字override,先别着急我们先来运行下Default.aspx页面看下运行结果,结果如下:

  别让俺干活,俺在充电中!

  怎么样现在Robot的dining()符合机器人的充电实际效果了吧。他是怎么实现的呢?

  我们先来看下Robot的public override string dining(),这个方法与基类Peoplo中的dinind()方法签名一模一样,而且前面还有一个关键字override,这用声明方法的作用是重写基类中的dining()方法,这个声明关键就在于关键字override,他表示我要重写基类中的一个方法,那么要重写基类的哪个方法呢,这时候方法名dining()就派上用场了,他表示要重写基类的哪个方法,注意这个方法名一定要和基类中的方法签名一模一样(不光是方法名一样,参数的类型,数量,顺序要必须一致),如果这个方法签名与基类中被重写的方法签名不一致会发生错误。

  那么是不是在派生类中能够将基类中的方法全部都能够重写呢,未必!这还要看看基类中的方法是不是可以被重写,怎么识别或设置基类中的方法能被重

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,