多态,顾名思义就是有多种的形态。就像每个人对每件事物做出的不一样的选择。
关于多态在这里想表达的第一个知识点就是里氏替换及多态的应用:
里氏替换是软件设计时应该遵守的重要原则之一!!有了里氏替换法则才能继承复用成为可能,只有当子类替换掉父类时,软件的功能不受影响,父类被正常使用,而子类也能够在父类的基础上增加新的行为。
下面写一个例子:
//父类 鸟 public class Bird { //飞行速度 public double Speed{get;set;} //飞 public void Fly() { } } //鸵鸟 public class TuoBird:Bird { ..... }
但是大家都知道鸵鸟是不会飞的,所在在这里Fiy()方法什么也没做。这就违背了里氏替换
为了解决这个问题,出现了两个操作符分别是:is 和 as
is操作符:用于检查对象和指定的类型是否兼容
as操作符:用于两个对象之间的类型转换
父类作为参数:里氏替换原则指出子类对象可以代替父类对象,那么在开发程序中可以编写以父类类型作为形式参数的方法,在实际调用时传入子类对象从而实现多态。
下面写一个例子:
//交通工具父类 public class Traffic { //run public virtual void Run() { Console.WriteLine("父类Run"); } }
//小汽车 public class Car:Traffic { public override void Run() { Console.WriteLine("一个长相 清秀 的 小男孩 坐在 一辆 豪华的car中 ,白皙小手里拿着一本 Accp7.0 S2深入.NET 编程 认真的阅读中 ,而此时 ,轿车正在宽阔的马路上飞驰着......."); } }
//自行车 public class Bicycle:Traffic { public override void Run() { Console.WriteLine("小明在2016年3月1日 骑着 一辆 很破很破 的 凤凰牌自行车 高兴的行驶在坑坑洼洼 泥泥泞泞 高低不平的 土路上"); } }
//员工类 public class Employee { //回家 借助 Traffic public void GoHome(Traffic traffic) { traffic.Run(); } }
抽象类和抽象方法
如何将一个普通类变成抽象类?
(1)关键字:abstract
(2)抽象类不能实例化
(3)抽象方法没有方法体连{}也没有
(4)一个类如果继承的是抽象类那么它必须重写抽象类中所有的抽象方法
(5)抽象类不能是静态的或者是密封的 例如string
(6)抽象方法存在抽象类中,抽象类中可以由普通类
(7)抽象类中抽象方法只有用来规定子类的方法形式(参数 返回值)
(8)告诉大家的秘密 一般人我都不说的,有快捷键 ctrl+.+回车
跟大家说一下虚方法和抽象方法的区别
虚方法 | 抽象方法 |
用virtual修饰 | 用abstract修饰 |
要有方法体即使是分号 | 不允许有方法体 |
可以被子类override | 必须被子类override |
除了密封类外都可以定义 | 只能在抽象类中定义 |