1. 里氏替换原则:
子类除了可以具有父类非私有的成员和方法外,还可以拥有自己特有的成员变量和方法。
2.is和as操作符的使用:
is操作符用于检查对象和指定的类型是否兼容。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace MyOffice
{
class Program
{
static void Main(string[] args)
{
//实例化程序员对象
SE ai = new SE("112", "艾边成", 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<Employee>();
empls.Add(ai);
empls.Add(joe);
empls.Add(pm);
//遍历问好
foreach(Employee empl in empls)
{
if (empl is SE)
{
Console.WriteLine(((SE)empl).SayHi());
}
if(empl is PM)
{
Console.WriteLine(((PM)empl).SayHi());
}
}
Console.ReadLine();
}
}
}
as操作符主要用于两个对象之间的类型转换。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace MyOffice
{
class Program
{
static void Main(string[] args)
{
//实例化程序员对象
SE ai = new SE("112", "艾边成", 25, Gender.male, 100);
SE joe = new SE("113","Joe",30,Gender.female,200);
//实例化PM对象
PM gates = new PM("890","盖茨",50,Gender.female,30);
List<Employee> empls = new List<Employee>();
empls.Add(ai);
empls.Add(joe);
empls.Add(gates);
//遍历问好
for (int i = 0; i < empls.Count;i++ )
{
if(empls[i] is SE)
{
SE se = empls[i] as SE;
Console.WriteLine(se.SayHi());
}
if (empls[i] is PM)
{
PM pm = empls[i] as PM;
Console.WriteLine(pm.SayHi());
}
}
Console.ReadLine();
}
}
}
3.父类类型作为参数:以父类为参数,可以接收它的子类类型,程序在运行中自动判断实际参数属于哪种子类
实现交通工具继承关系:
public class TrafficTool
{
public virtual void Run()
{
Console.WriteLine(“车在行驶!");
}
}
public class Car:TrafficTool
{
public override void Run()
{
Console.WriteLine(“小汽车在行驶!");
}
}
4.用虚方法实现多态的步骤:
1)子类重写父类的虚方法
2)两种方式:
创建父类变量,实例化子类对象
把父类类型作为参数类型,该子类及子类对象作为参数传入
3)运行时,根据实际创建的对象决定执行哪个方法
5.抽象类和抽象方法
语法:
[访问修饰符] abstract class 类名
{
[访问修饰符] abstract 返回类型 方法名();
}
抽象类用来列举一个类所需要的行为
抽象类不明确提供具体实现方法
抽象类必须由其子类实现它的抽象方法(除非子类也具有抽象性)
常见错误:
1.抽象类不能被实例化 2.抽象类不能是密封或者静态的
实现抽象方法:
使用override实现抽象方法的重写
语法:
[访问修饰符] override 返回类型 方法名() {
}
示例:
public class Tube:TrafficTool
{
public override void Run()
{
Console.WriteLine("地铁运行中!");
}
}
抽象类的应用场合:父类提供一系列规定,约束子类的行为。
抽象方法与虚方法的区别:
抽象方法 | 虚方法 |
用 abstract 修饰 | 用 virtual 修饰 |
不允许有方法体 | 要有方法体,哪怕是一个分号 |
必须被子类 override | 可以被子类 override |
只能在抽象类中 | 除了密封类都可以写 |
面向对象的三大特性:
封装:隐藏内部实现,稳定外部接口 。
继承:子类继承父类成员,实现代码复用 。
多态:不同子类对同一个消息作出不同的反应 。