继承
- 如果多个类中拥有共同的属性和方法,那么可以提取出公共的属性和方法定义为一个新类,此类即为
父类(基类/超类)
- 多个具有相同属性和方法的类被称为
子类(派生类)
- 他们之间的关系是:
子类 继承 父类
- 特点:
a. 子类拥有父类的所有字段、属性和方法。
b. 构造方法不能被继承。
c. 一个类只能有一个父类,可以拥有多个子类。
示例
定义一个硬件类,包括 CPU 硬盘 内存 显卡 主板 电源 类,他们拥有共同属性为 名称 价格 属性
class MainClass
{
public static void Main(string[] args)
{
CPU cpu = new CPU
{
Name = "CPU"
};
cpu.SetPrice(100d);
Console.WriteLine(cpu.Name); // CPU
Console.WriteLine(cpu.GetPrice()); // 100
GPU gpu = new GPU
{
Name = "GPU"
};
gpu.SetPrice(120d);
Console.WriteLine(gpu.Name); // GPU
Console.WriteLine(gpu.GetPrice()); // 120
}
}
/// <summary>
/// 硬件类 - 父类
/// </summary>
class Hardware
{
public string Name;
private double Price;
public void SetPrice(double price)
{
Price = price;
}
public double GetPrice()
{
return Price;
}
}
/// <summary>
/// CPU 继承 硬件
/// </summary>
class CPU : Hardware { }
/// <summary>
/// 显卡 继承 硬件
/// </summary>
class GPU : Hardware { }
/// <summary>
/// 硬盘 继承 硬件
/// </summary>
class Disk : Hardware { }
/// <summary>
/// 内存 继承 硬件
/// </summary>
class Memory : Hardware { }
/// <summary>
/// 主板 继承 硬件
/// </summary>
class MainBoard : Hardware { }
/// <summary>
/// 电源 继承 硬件
/// </summary>
class PowerSupply : Hardware { }
继承之构造方法
- 报错代码
Dog dog = new Dog(); // Error 子类在实例化的时候会先实例化父类中的无参构造方法
class Animal {
public string name;
public Animal(string name)
{
this.name = name;
}
}
class Dog : Animal { // Error
public uint age;
}
- 报错原因:
- 原因一:
子类在实例化的时候会先实例化父类中的无参构造方法,因为Animal中无无参构造方法
- 解决(方案一):
父类提供一个无参构造方法
Dog dog = new Dog();
class Animal {
public string name;
public Animal()
{
}
public Animal(string name)
{
this.name = name;
}
}
class Dog : Animal {
public uint age;
}
- 原因二:
子类在实例化的时候会先实例化父类中的构造方法,因为Animal中是有参的构造方法,所以需要在子类构造之前先调用父类中的有参构造方法
- 解决(方案二):
类构造之前先调用父类中的有参构造方法
Dog dog = new Dog();
class Animal {
public string name;
public Animal(string name)
{
this.name = name;
}
}
class Dog : Animal {
public uint age;
// base(参数) -> 执行Dog构造方法之前先去执行他的父类构造方法
public Dog() : base("")
{
}
}
- 解决思想:
想办法让父类实例化的时候合理化(让父类实例化的时候不会报错)