一、封装、继承、多态关系说明
封装、继承、多态这三大特性是相互关联的,封装和继承几乎都是为多态而准备的。
封装是基础,继承是关键,多态性是补充。
多态性存在于继承性之中,它是继承性的进一步扩展,没有继承就没有多态。
通过多态可以实现代码重用,减少代码量,提高代码的可扩展性和可维护性
二、什么是多态
多态是对同一个函数(功能)出现了不同种的实现方式。
从类到抽象类,从抽象类到接口,这其实是人们对于多态功能的演变。
通过多态可以实现代码重用,减少代码量,提高代码的可扩展性和可维护性。
三、两种多态
编译时的多态性(静态多态)(重载)
运行时的多态性(动态多态)(重写)
1、编译时的多态
编译时的多态性是通过重载来实现的。
对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
具有运行速度快的特点。
(1)方法重载:
可以在同一个范围内对相同的方法名有多个定义。
方法的定义必须彼此不同,可以是参数列表中的参数类型不同,也可以是参数个数不同。
不能重载只有返回类型不同的方法声明。
(2)运算符重载
比如数值计算的+=,字符串的+=,委托事件的+=
(3)隐藏方法
通过new修饰符来实现对继承的方法重载;
子类Dog类调用hello()时,在方法前添加new关键字,覆盖掉父类Animal类的hello函数,调用自身的hello()函数。
2、运行时的多态
C#中运行时的多态性是通过重写实现。
运行时的多态性是指直到系统运行时,才根据实际情况决定实现何种操作。
具有高度灵活和抽象的特点。
(1)虚函数
(2)抽象方法
(3)接口实现
四、类的继承关系来实现多态
1、虚函数(运行时多态)
父类虚函数virtual,子类override重写 。
在运行时父类指针可以指向任意一个子类的地址,选择不同的实现
2、抽象函数(运行时多态)
父类抽象函数abstract,子类实现。
父类抽象函数,只有函数声明部分;子类继承了父类,实现抽象函数
3、隐藏方法(也叫重载,编译时多态)
子类中用隐藏函数的方法重写
五、接口中多态的实现
c#中子类必须且只能继承一个父类,但我们又要同时重写两个属于不同类的成员函数,为了解决这个问题,人们开发出了 接口 这个技术。
1、多重继承
接口的特点是能够多重继承,每个接口中只能够写声明,实现接口中的成员完成多态的表示。
2、多个类继承同一个接口
3、接口和接口之间可以进行继承
4、继承条件
使用接口实现多态 需要满足以下两个条件:
(1)定义接口并使用类实现了接口中的成员。
(2)创建接口的实例指向不同的实现类对象。