前言
当子类方法和父类方法相同时,可以隐藏基类方法,也可以用虚方法,这时子类就可以重写父类的方法了,这就是类的多态形式,重写还可以用在抽象方法中,并且是抽象方法的类就必须重写,虚方法和抽象方法都能让子类重写,它们之间有什么区别呢?
虚方法
类的方法名可以和父类的方法名重名,但是会报绿线,为了解决这个问题可以在子类方法的修饰符后面加New,第二种方法就是在父类的访问修饰符后加Virtual,在基类中使用virtual修饰的方法称为虚方法。
1. virtual修饰符不能与static、abstract或者override修饰符同时使用;
2. 方法重写与积累的签名必须一致
3. virtual不能与private一起使用,因为虚方法不能是私有的
4. 可以重写override,写可以不override
在上图代码中,在基类Person中定义了虚方法GetName(),现在在子类Teacher中重写GetName()方法:
在子类中实例化并且调用:
抽象方法
- 抽象方法必须用在抽象类中,有抽象类的不一定有抽象方法
- 子类不能写成抽象类,因为只有子类能重写,抽象类中的抽象方法必须被子类重写
- 抽象类除了类有abstract修饰符,它内部跟普通类一样,可以有:属性、构造、已经实现的方法。
- 必须重写
namespace _01.多态抽象方法和抽象类
{
class Program
{
static void Main(string[] args)
{
Pig pig = new Pig(); //实例化派生类 等价于 Aniaml pig = new Pig();
pig.Shout();//使用派生类对象实例化抽象类
Console.ReadKey();
}
}
public abstract class Aniaml//声明抽象类
{
public abstract void Shout(); //抽象方法只能定义在抽象类中,没有方法体
}
public class Pig:Aniaml //继承抽象类,子类必须重写抽象方法
{
public override void Shout() //重写抽象类的抽象方法
{
Console.WriteLine("哼哼。。。");
}
}
}
虚方法和抽象方法比较
虚方法 | 抽象方法 |
---|---|
用virtual修饰 | 用abstract修饰 |
基类中要有方法体 | 基类中不允许有方法体 |
可以被子类override | 必须被子类override |
除了密封类都可以写 | 只能在抽象类中 |
总结
通过比较清晰了不少,在以后的学习和运用中一定会越来越熟练。