初识继承和多态
显式调用父类构造函数
C#可以用base关键字调用父类的构造函数。只要在子类的构造函数后添加":base(参数列表)",就可以指定该子类的构造函数调用父类的哪个构造函数了。这样便可以实现继承
属性的初始化,然后在子类本身的构造函数中完成对子类特有属性的初始化即可。
示例:
//Employee类的构造函数
public Employee(string id, int age, string name, Gender gender)
{
this.ID = id;
this.Age = age;
this.Name = name;
this.Gender = gender;
}
//SE 类构造函数
public SE(string id, string name, int age, Gender gender, int popularity):
base(id,age,name,gender)
{
//继承自父类的属性
//调用父类的构造函数可以替换掉的代码
//this.ID = id;
//this.Age = age;
//this.Name = name;
//this.Gender = gender;
this.Popularity = popularite;
}
在上面的示例中,SE类从Employee类继承的属性,如ID、Name、和Gender通过base关键字调用父类的构造函数进行初始化,而SE类自己特有的属性Popularity在
SE类的构造函数中初始化.
继承的特效
继承的传递性
在前面我们说卡车和公共汽车继承汽车,也就是卡车和公共汽车都具有汽车的特征。其实卡车还可以分为小型卡车和重型卡车,公共汽车还可以分为单层公共汽车和双层公
共汽车。小型卡车和重型卡车都具有卡车的特征,如载重量、拉货、卸货等,同时他也具有汽车的各种特征。小型卡车is a卡车, 卡车is a 汽车, 小型卡车is a汽车
is a 的应用
如果要实现MyOffice案例中所有人员,包括SE和PM的问号功能,并且要求所有对象都存储在泛型集合List<T>中,该如何实现呢?
由于SE和PM都继承Employee,即SE is a Employee, PM is a Employee, 所有可以定义一个List<Employee>的集合,SE和PM都可以加入到这个集合中。当要
遍历集合进行问号时,只需对每个对象的类型进行判断.
//实例化SE对象
SE ai = new SE("122","艾边成",25,Gender.male,100);
SE joe = new SE("113","Joe",30,Gender.female,200);
//实例化PM对象
PM pm = new PM("890","盖茨",50,,Gender.female,30);
List<Employee> empls = new List<Emoloyee>();
empls.Add(ai);
empls.Add(joe);
empls.Add(pm);
//遍历问号
foreach(Employee empl in empls)
{
if(empl is SE)
{
Console.WriteLine(((SE)empl).SayHi());
}
}
继承的价值
继承模拟了现实世界的关系,OOP中强调一切皆对象,这符合我们面向对象编程的思考方向。
继承实现了代码的重用,则在示例中我们已经有所体会,合理地使用继承,会使代码更加简洁。
继承使得程序结构清晰,子类和父类的层次结构清晰,最终的目的是使子类只关注子类的相关行为和状态,无需关注父类的行为与状态。
多态:
访问修饰符 virtual 返回类型 方法名()
{
//方法体
}
访问修饰符 override 返回类型 方法名()
{
//方法体
}
当遍历父类对象调用其方法时,无需考虑子类到底是什么类型,就可以正确地调用子类的相关方法。不同的对象对于同一个方法调用有着不同的执行结果,我们称这种特性为多态。
继承必须符合is a的关系,被继承的类称为父类或者基类,继承其他类的类称为子类或者派生类。
继承机制很好地解决了代码复用的问题
子类继承父类的成员,并且可以拥有自己特有的成员
被protected访问修饰符修饰的成员允许被其他子类访问,而不允许其他非子类访问
base关键字可以用于调用父类的属性、方法、和构造函数
继承具有传递性,如果class A:B, class B:C, 则A也可以访问C的成员
C#中的继承具有单跟性,一个类不能够同时继承自多个父类
在子类中,如果不使用base关键字来显式调用父类构造函数,则将隐式调用父类默认的构造函数
如果重载的构造函数有一个没有使用base关键字来指明调用父类的哪个构造函数,则父类必须提供一个默认的构造函数
多态按字面的意思就是多种形态,指同一 操作用于不同的对象时,可以有不同的解释,产生不同的执行结果
可以用虚方法实现多态

浙公网安备 33010602011771号