zoukankan      html  css  js  c++  java
  • C#中abstract与virtual的用法

    关于C#中的abstract与virtual的用法一直迷糊。于是自己动手写一写试试。

    1.第一种情况

    //抽象动物类,声明抽象方法Shout(),注意抽象方法没有方法体
    abstract class Animal
        {
            public abstract void Shout();
        }
    // 猫类,继承动物类,覆盖抽象Shout()方法
    class Cat:Animal
        {
            public Cat()
            {
            }
    
            public override void Shout()
            {
                Console.WriteLine("喵喵!");
            }
        }
    // 狗类,继承动物类,覆盖抽象Shout()方法   
     class Dog:Animal
        {
            public Dog()
            {
            }
    
            public override void Shout()
            {
                Console.WriteLine("汪汪!");
            }
        }
    // 客户程序调用
    static void Main(string[] args)
            {
                Animal cat = new Cat();
                cat.Shout();
                Animal dog = new Dog();
                dog.Shout();
                Console.ReadKey();
            }

    运行结果如下:

    image

    2.第二种情况

    如果用virtual,Animal类则修改如下,注意虚方法要有方法体。

    abstract class Animal
        {
            public virtual void Shout()
            {
                Console.WriteLine("动物叫!");
            }
        }

    运行结果依旧:

    image

    在第一种情况下,由于子类必须要实现基类的抽象方法,所以如果把Cat类的Shout()方法去掉,程序编译会报错。

    但是在第二种情况下,如果把Cat类的Shout()方法去掉,则客户端没有覆盖基类的Shout()方法,cat.Shout()会调用基类的Shou()方法。运行结果如下:

    image

  • 相关阅读:
    ruby 中 raise 抛出异常
    ruby中attr_accessor方法的理解
    Redis实现分布式缓存
    应用服务器集群概念
    反向代理和正向代理区别
    如何限制同一用户同时登录多台设备?
    Docker 初始
    Java 的反射机制你了解多少?
    JWT 实战
    判断 uniapp 项目运行到 什么机型
  • 原文地址:https://www.cnblogs.com/liming1019/p/1653728.html
Copyright © 2011-2022 走看看