多态的四个概念(重载,重写,虚方法和抽象方法)
前言
多态性分为两种,一种是编译时的多态性,一种是运行时的多态性。
编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中运行时的多态性是通过重写虚成员实现。
重载
什么是重载?
同一个方法名,根据参数的类型,参数的个数,编译器就能够根据实参的不同,确定在哪种情况下调用哪个方法
重载很好的体现了面向对象的多态性
重写
什么是重写?
关键字:override
重写是指子类重新实现父类的某些方法,以实现一些新的功能
抽象类
什么是抽象类
关键字:abstract
特性:
1.抽象类不能被实例化
2.抽象类可以是一个正常的类,但是抽象方法必须包含在抽象类中
3.我们会把抽象类视为公共基类,如果使用了sealed 修饰符,或者静态修饰符,
这意味着抽象类将不能被继承,所以抽象类不能的密封或者静态的
4.继承抽象类的非抽象类,必须实现未实现的方法,也就是必须被重写
什么是抽象方法?
一个抽象方法通俗易懂的说就是一个没有方法体的方法,
1):抽象方法是隐式的虚方法。
2):只允许在抽象类使用抽象方法声明。
3):因为抽象方法声明不提供实际的实现,所有没有方法体。方法声明只是以一个分号结束,并且在签名后没有大括号,实现由一个重写方法提供,此重写方法是非抽象类的成员。
4):在抽象方法声明中使用static或virtual修饰符是错误的。
5):除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
6):在静态属性上使用abstract修饰符是错误的。
7):在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。
下面两种抽象方法的写法都是可以的(抽象方法不能设置私有的)
//抽象方法 public abstract void Run(); abstract public void Stop();
抽象方法与抽象类的关系
有抽象方法的类必然是抽象类,
但是,抽象类中的方法并不一定都是抽象方法。
抽象类与一般类的相同点及不同点
相同点:
都可以继承其它的类或者接口,也可以派生子类,并且都有具体的方法;
不同点:
抽象类中有抽象方法,一般类中没有;
抽象类不可以实例化,一般类却可以;
虚方法
关键字:virtual
当子类继承父类时,可以对父类中的虚方法进行重写。
在基类中定义了virtual方法,但是在派生类中没有重写该徐方法,那么调用方法的时候,该方法使用的就是基类中的方法
如果使用override重写了该方法,则使用的方法就是重写过后的方法
抽象方法与虚方法的区别
1.虚方法有方法体,抽象方法没有方法体
2.抽象方法必须被重写,虚方法可以不重写
3.抽象方法只能在抽象类中声明,虚方法不是;
抽象方法与虚方法的共同作用
实现多态,提供给子类重写的方法