• 虚方法(virtual)和抽象方法(abstract)的区别


    一,直接上代码,后总结:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Demo
    {
        class Program
        {
            static void Main(string[] args)
            {
                Testvirtual Tv = new Testvirtual();
                Tv.Say();
                Tv.CommonMethod();
                Instanvirtual Iv = new Instanvirtual();
                Iv.Say();
    
                //Testabstract Ta = new Testabstract();  //提示错误:无法创建抽象类或接口的实例
                Testabstract Ta = new Instanabstract();
                Ta.Say();
                Ta.SayVir();  //而抽象类中存在虚方法则不必需在派生类(子类)中重写,因为虚方法本身有声明主体,所以一样可以输出
                Console.ReadKey();
    
            }
        }
        public class Testvirtual
        {
            public virtual void Say()
            {
                Console.WriteLine("虚方法");
            }
    
            public void CommonMethod()
            {
                Console.WriteLine("一般方法");
            }
        }
        public class Instanvirtual : Testvirtual
        {
            public override void Say()
            {
                Console.WriteLine("重写虚方法");
            }
    
            //这个如果父类一般方法没有使用virtual,abstract关键字,则会提示没有找到适合的方法来重写
            //public override void CommonMethod()
            //{
            // Console.WriteLine("重写一般方法");
            //}
        }
        public abstract class Testabstract  //定义抽象方法,必须在抽象类中
        {
           // public abstract void Test() {     //如果这样会会提示:无法声明主体,因为它标记为abstract,并且提示不实现继承的抽象成员
             //   Console.WriteLine("抽象方法");
            //}
    
            public virtual void SayVir() {
                Console.WriteLine("抽象类的虚方法");
            }
    
            public abstract void Say();
    
            public void CommonMethod() { }
        }
    
        public class Instanabstract : Testabstract
        {
            public override void Say()
            {
                Console.WriteLine("重写抽象方法");
            }
    
            //这个如果父类一般方法没有使用virtual,abstract关键字,则会提示没有找到适合的方法来重写
            //public override void CommonMethod() {
            //Console.WriteLine("重写一般方法");
            //}
        }
    }

    综上总结出:如果一般方法没有使用virtual,abstract关键字,则会提示没有找到适合的方法来重写,

    一,抽象方法:

    1,抽象方法必须在抽象类中定义

    2,抽象方法必须在派生类(子类)中实现

    3,抽象类中的抽象方法无法声明主体,因为它标记为abstract

    4,无法创建抽象类或接口的实例

    二,虚方法

    1,虚方法不必须在派生类(子类)中重写实现

    2,虚方法声明方法实体

    3,可以创建虚方法类的实例

     4,如果抽象类中有虚方法,不必须在派生类(子类)中重写,如上代码调用实现

  • 相关阅读:
    完整版excel上传导入读写批量数据并将反馈结果写入远程exel中
    将数据写入已有的excel文件
    微服务项目启动问题
    通过POI实现上传EXCEL的批量读取数据写入数据库
    [转] VLAN原理详解
    [转载]git tag — 标签相关操作
    [转载]SQLite3性能优化
    [转载]提升SQLite数据插入效率低、速度慢的方法
    [转载]sqlite3遇到database is locked问题的完美解决
    一个Linux下C线程池的实现(转)
  • 原文地址:https://www.cnblogs.com/May-day/p/6489523.html
Copyright © 2020-2023  润新知