• 虚方法与抽象方法


       虚方法 virtual,虚方法给父类提供了一种默认的实现,子类可以使用override重写虚方法,虚方法不能出现在密封类(sealed)中。

           抽象类,不能被实例化,但可以实例化其子类的对象,抽象方法必须出现在抽象类中,抽象方法必须在子类中重写。子类继承抽象类,必须重写抽象类中所有的抽象方法(除非子类也是抽象类)

    作为父类来用,抽象类给子类提供公共的实现(非抽象方法)和能力,为子类提供所需要的成员,抽象类中也可以有实现

            让父类引用指向子类对象,把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。所有的方法掉用都通过父类 类似于中转

    虚方法与抽象方法的区别

    1 虚方法必须有实现部分(默认实现 在子类中根据需要修改),抽象方法没有提供实现部分

    2 抽象方法必须在抽象类中声明,虚方法可以在类中实现

    3 抽象方法必须在子类中重写,虚方法可以被重写

    下面用代码来说明:

    定义三个类 Animal Cat Dog    Animal为父类 含有Cat和Dog共有的Say()方法

    Animal :

    abstract class Animal
        {
            //虚方法
            public virtual void Say()
            {
                Console.WriteLine("喵喵..");
            }
            //共有方法
            public void Eat()
            {
                Console.WriteLine("吃宠物粮");
            }
            //抽象方法不能有实现
            abstract public void Sleep();
        }

    Cat : 实现父类中的抽象方法

    class Cat:Animal
        {
            //重写抽象方法
            public override void Sleep()
            {
                Console.WriteLine("白天睡觉");
            }
        }

    Dog:重写父类中定义的Say()虚方法

    class Dog:Animal
        {
            //重写Say()方法
            public override void Say()
            {
                Console.WriteLine("旺旺旺");
            }
    
            public override void Sleep()
            {
                Console.WriteLine("晚上睡觉");
            }
        }

    看看调用:  Animal为抽象方法,不能直接实例化。这里实例化子类并存放在数组中

    class Program
        {
            static void Main(string[] args)
            {
                Animal[] cd ={
                                new Cat(),
                                new Dog()
                };
                foreach (Animal item in cd)
                {
                    item.Eat();
                    //当item为Dog类型的时候item.Say()会调用dog类中的方法而不是父类Animal中的Say()方法
                    //先扫描子类Dog中是否有Say()方法 如果没有的话才会调用父类中Say()方法
                    item.Say();
                    item.Sleep();
                }
                Console.Read();
            }
        }
  • 相关阅读:
    我的Java学习路线图
    请求重定向和请求转发的区别
    PHP代码审计学习-php安全基础
    无密码正向直连内网linux目标机复现
    Windows API 学习
    Http请求走私
    免杀手法-tcp套字节传递shellcode学习
    自启动模块构造-计划任务
    自启动模块构造-快速启动目录
    进程注入免杀学习
  • 原文地址:https://www.cnblogs.com/liuzhiye/p/2676680.html
Copyright © 2020-2023  润新知