里氏替换原则
子类的对象能够替换其父类
父类对象不能够替换子类
父类的方法都要在子类中实现或者重写
示例:
List<Persons> listPerson = new List<Persons>();
listPerson.Add(s1);
listPerson.Add(s2);
listPerson.Add(s3);
listPerson.Add(s4);
listPerson.Add(t1);
listPerson.Add(t2);
listPerson.Add(t3);
for (int i = 0; i < listPerson.Count; i++)
{
listPerson[i].SayHi();
}
在Person类中定义了抽象方法SayHi,在Student和Teacher类中分别对SayHi进行了重写。将他们都放到list集合中时,他们分别具有不同的类型。
监视listPerson[i]结果显示:
当i=0到3是listPerson[i]的类型是Student
当i=4到6是listPerson[i]的类型是Teacher
这是一个里氏替换的例子,子类会代替父类。
虚方法和抽象方法
抽象方法
方法声明时加上 abstract 关键字,包含抽象方法的类必须是抽象类,因为抽象方法仅仅只有方法的定义(连大括号{}都没有),它必须在子类中进行重写,除非这个子类还是抽象类,由于有这个抽象方法的存在,这个类不能被实例化使用。因而在包含抽象方法的类前也要加上abstract关键字。
//抽象方法
public abstract void SayHi();//后面没有大括号,更没有里面的内容!
仅仅是方法的定义,不能包含方法体
必须在子类中重写override
只能存在于抽象类中
虚方法
方法声明是加上了virtual关键字,与抽象方法不同的是,它提供了一个默认的方法体,其子类可根据自己的需要对其进行重写。如果不重写就会调用默认的方法。
public virtual void SayHi()
{
Console.WriteLine("大家好,我是:{0},今年:{1}岁了!",Name ,Age );
}
要有方法体,仅仅一个分号也可以
子类中可以重写,也可以不重写
除了不能在密封类中,其他类中都可以
重写 override
在子类中,如果父类中有抽象方法(abstract)或者虚方法(virtual),可以用override对其进行重写。
示例:
public override void SayHi()
{
Console.WriteLine("同学们好,我是{0},性别{1},年龄{2},工资{3},教龄{4}。",Name ,Gender ,Age ,Salary ,YearOfService );
}//在Teacher类中对父类Person的SayHi方法重写
面向对象的三大特性
封装
隐藏内部实现,稳定外部接口
继承
子类继承父类成员,实现代码复用
多态
不同子类对同一消息做出不同的反映
is 和 as
is
- is用于检查对象是否与指定类型兼容
检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false,永远不会抛出异常。
如果对象引用为null,那么is操作符总是返回为false,因为没有对象可以检查其类型。
if (person[i] is Student)//判断Person集合的某元素是不是Student类型
as
- as用于在兼容的引用类型之间指向转换
必须是引用类型,不能是值类型。