【C#】虚方法和抽象方法

前言

   当子类方法和父类方法相同时,可以隐藏基类方法,也可以用虚方法,这时子类就可以重写父类的方法了,这就是类的多态形式,重写还可以用在抽象方法中,并且是抽象方法的类就必须重写,虚方法和抽象方法都能让子类重写,它们之间有什么区别呢?

虚方法

   类的方法名可以和父类的方法名重名,但是会报绿线,为了解决这个问题可以在子类方法的修饰符后面加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
除了密封类都可以写 只能在抽象类中

总结

   通过比较清晰了不少,在以后的学习和运用中一定会越来越熟练。

猜你喜欢

转载自blog.csdn.net/a15076159739/article/details/81775238