什么是继承?
继承是将两个类中相同的属性及方法抽取出来,放到一个新的类中(父类),而这两个子类依然拥有这些属性和方法。抽象点的
说,每辆车子都能跑(拥有跑的方法),都有轮胎(有轮胎这个属性)。
使用继承编程的好处?
使用继承编程可以大大的减少代码冗余,增加代码复用。
如何使用继承?
以第一问为例做延伸:假若我们现在需要两个类,一个货车类,一个轿车类。代码如下
- /// <summary>
- /// 货车类
- /// </summary>
- class Truck
- {
- //时速
- public int Speed { get; set; }
- //颜色
- public string Colour { get; set; }
- //购买价格
- public double Price { get; set; }
-
- /// <summary>
- /// 货运方法
- /// </summary>
- public void Cargo()
- {
- Console.WriteLine("运输货物");
- }
- }
-
- /// <summary>
- /// 轿车类
- /// </summary>
- class Sedan
- {
- //时速
- public int Speed { get; set; }
- //颜色
- public string Colour { get; set; }
- //购买价格
- public double Price { get; set; }
-
- /// <summary>
- /// 载客方法
- /// </summary>
- public void CarryPassengers()
- {
- Console.WriteLine("载客");
- }
- }
-
- 示例 : 未使用继承
复制代码
通过这段代码不难发现,货车类和轿车类拥有三个相同的属性,一个不同的方法。根据继承的特性,需要把相同的属性或方法抽
取出来。代码如下
- /// <summary>
- /// 车辆类 父类
- /// </summary>
- class Vehicle
- {
- //时速
- public int Speed { get; set; }
- //颜色
- public string Colour { get; set; }
- //购买价格
- public double Price { get; set; }
- }
-
- /// <summary>
- /// 货车类 继承车辆类
- /// </summary>
- class Truck : Vehicle
- {
- /// <summary>
- /// 货运方法
- /// </summary>
- public void Cargo()
- {
- Console.WriteLine("运输货物");
- }
- }
-
- /// <summary>
- /// 轿车类 继承车辆类
- /// </summary>
- class Sedan : Vehicle
- {
- /// <summary>
- /// 载客方法
- /// </summary>
- public void CarryPassengers()
- {
- Console.WriteLine("载客");
- }
- }
-
- 示例 : 使用继承
复制代码
那么问题又来了,继承的特性-代码复用体现在哪里呢?下面我们简单地了解一下。
在第一段代码中,有两个类,如果我们想在创建对象时使用带参构造函数来初始化属性的话,要在两个类中都写上相同的一段代
码。(构造函数详解)
- /// <summary>
- /// 货车类
- /// </summary>
- class Truck
- {
- //时速
- public int Speed { get; set; }
- //颜色
- public string Colour { get; set; }
- //购买价格
- public double Price { get; set; }
- public Truck(int speed, string colour, double price)
- {
- this.Speed = speed;
- this.Colour = colour;
- this.Price = price;
- }
- ...
- }
-
- /// <summary>
- /// 轿车类
- /// </summary>
- class Sedan
- {
- //时速
- public int Speed { get; set; }
- //颜色
- public string Colour { get; set; }
- //购买价格
- public double Price { get; set; }
- public Truck(int speed, string colour, double price)
- {
- ...
- }
- ...
- }
-
- 示例 : 冗余的代码
复制代码
显而易见,上面的重复代码很多。下面我们使用继承来简化一下上面的代码。
- /// <summary>
- /// 车辆类 父类
- /// </summary>
- class Vehicle
- {
- //时速
- public int Speed { get; set; }
- //颜色
- public string Colour { get; set; }
- //购买价格
- public double Price { get; set; }
-
- /// <summary>
- /// 带参构造函数
- /// </summary>
- /// <param name="speed"></param>
- /// <param name="colour"></param>
- /// <param name="price"></param>
- public Vehicle(int speed, string colour, double price)
- {
- this.Speed = speed;
- this.Colour = colour;
- this.Price = price;
- }
- }
-
- /// <summary>
- /// 货车类 继承车辆类
- /// </summary>
- class Truck : Vehicle
- {
- /// <summary>
- /// 子类使用父类构造函数
- /// </summary>
- public Truck(int speed, string colour, double price) :
- base (speed,colour,price)
- {
-
- }
- ...
- }
-
- /// <summary>
- /// 轿车类 继承车辆类
- /// </summary>
- class Sedan : Vehicle
- {
- /// <summary>
- /// 子类使用父类构造函数
- /// </summary>
- public Sedan(int speed, string colour, double price) :
- base (speed,colour,price)
- {
-
- }
- ...
- }
-
- 示例 : 简化的代码
复制代码
用了继承之后,即使再多的派生类需要带参构造函数,也不怕了,只要一行代码即可完成。
Base关键字:
base关键字表示父类,可以用于访问父类的成员。例:base.父类成员。
除了上面通过base显示的调用父类带参构造函数外,创建子类对象时还会隐式的调用父类的无参构造函数。(创建子类对象时会先调用父类的无参构造函数。)
进一步了解和使用继承
继承的特性:
1.传递性:继承可以无限的向下派生,但是需要符合一个条件:子类可以出现在父类出现的地方并替换父类,即子类 拥有父类的全部特征和能够实现父类的全部方法。
2.单根性:一个子类只能继承自一个父类。不存在一个子类同时继承自两个或多个父类的情况。
is a关键字:
这个关键字用来判断对象是否属于给定的类型。返回值为bool类型。
例:
if (Vehicle is Truck)
{
...
}
sealed关键字:
用这个关键字修饰的类是不能被继承的,即密封类。常用的string类就是密封类。本文只做了解,后更示例。
至此,关于继承已经讲得差不多了,下面是本文用到的所有代码,希望可以帮到看到此处的你。
- class Program
- {
- static void Main(string[] args)
- {
- Demo demo = new Demo();
- demo.Test();
-
- Console.Read();
- }
- }
-
- class Demo
- {
- List<Vehicle> vehicles = new List<Vehicle>();
-
- public void Test()
- {
- vehicles.Add(new Truck(50, "蓝色", 150000));
- vehicles.Add(new Sedan(80, "黑色", 210000));
- foreach (Vehicle item in vehicles)
- {
- if (item is Truck)
- {
- Console.WriteLine("我是货车,时速{0},我是{1}的,价格{2}元。", item.Speed, item.Colour, item.Price);
- ((Truck)item).Cargo();
- }
- if (item is Sedan)
- {
- Console.WriteLine("我是轿车,时速{0},我是{1}的,价格{2}元。",item.Speed,item.Colour,item.Price);
- ((Sedan)item).CarryPassengers();
- }
- }
- }
- }
-
- /// <summary>
- /// 车辆类 父类
- /// </summary>
- class Vehicle
- {
- //时速
- public int Speed { get; set; }
- //颜色
- public string Colour { get; set; }
- //购买价格
- public double Price { get; set; }
-
- /// <summary>
- /// 带参构造函数
- /// </summary>
- /// <param name="speed"></param>
- /// <param name="colour"></param>
- /// <param name="price"></param>
- public Vehicle(int speed, string colour, double price)
- {
- this.Speed = speed;
- this.Colour = colour;
- this.Price = price;
- }
- }
-
- /// <summary>
- /// 货车类 继承车辆类
- /// </summary>
- class Truck : Vehicle
- {
- /// <summary>
- /// 子类使用父类构造函数
- /// </summary>
- public Truck(int speed, string colour, double price) :
- base (speed,colour,price)
- {
-
- }
-
- /// <summary>
- /// 货运方法
- /// </summary>
- public void Cargo()
- {
- Console.WriteLine("我能运输货物");
- }
- }
-
- /// <summary>
- /// 轿车类 继承车辆类
- /// </summary>
- class Sedan : Vehicle
- {
- /// <summary>
- /// 子类使用父类构造函数
- /// </summary>
- public Sedan(int speed, string colour, double price) :
- base (speed,colour,price)
- {
-
- }
- /// <summary>
- /// 载客方法
- /// </summary>
- public void CarryPassengers()
- {
- Console.WriteLine("我可以载客");
- }
- }
-
- 完整代码
复制代码
结尾语:学到知识不与人分享,犹如衣锦夜行,毫无意义。
转自解放号社区:http://bbs.jointforce.com/topic/25682