C#继承
继承是个啥
简单的理解就是,让a类去继承b类,那么a类就会有b类中的属性,变量,方法,但不会继承b类的构造方法(相关构造方法的问题,下面再解释),当a类继承b类后,a类称作b类的子类,而b类称作a类的父类,还有其他的叫法,比如a对应派生类,b对应基类。
举个例子,假若写了一个动物类,其中包含年龄的属性,然后再写一个狗类去继承这个动物类,狗类中写入品种属性,当你调用狗类时,可以访问到品种以及年龄。
继承的代码格式
一个类要继承另一个类,那么在其声明时采用如下格式 class A :B{} 表示A类继承自B类,拿上面那个例子做个代码演示如下:
class Animal
{
int age;
}
class Dog : Animal
{
String Varieties;
}
继承的特点
第一:在上面也说了,子类继承父类以后,拥有父类的属性,变量,方法
第二:子类不会继承父类的构造方法
第三:一个类仅可继承自一个父类(大部分面向对象语言都是这样,但也有例外)
第四:一个类可被多个子类所继承
第五:用关键词sealed修饰的类不可被继承
C#继承的构造方法
子类实例化规则
在子类实例化时,先去实例化其父类部分,再去实例化子类的附加部分
子类实例化与构造方法的关系
由于实例化这个过程是要调用构造方法的,所以根据子类实例化规则,子类实例化时应先调用父类的构造方法将父类部分实例化出来,而默认是去调用父类的无参构造方法,因此当父类中写入且仅写入一个有参构造方法时,继承其的子类直接使用构造方法实例化会报错,因为调用不到无参构造方法。
继承中构造方法冲突的解决方案
- 在父类中再写入一份无参的构造方法,哪怕其方法体为空也可以。
- 让子类的构造方法之前执行父类的构造方法,使用以下格式让其实现
使一个方法在执行前调用另一个方法
修饰词 方法A() : 方法B() {方法体;}
以上格式意为在方法A执行前调用方法B;
有关方法B的一些关键词与操作:this代表当前类体,base代表父类类体;
下面再用上面的例子做一个代码演示,去演示子类中构造方法之前调用父类的有参构造方法
class Program
{
static void Main(string[] args)
{
Dog hsq = new Dog(6, "HSQ");
}
}
class Animal
{
public int age;
public Animal(int age1)
{
age = age1;
}
}
class Dog : Animal
{
public string Varieties;
public Dog(int a, string s) : base(a)
{
Varieties = s;
}
}