发现很多朋友对于C#中的Abstract和Virtual函数区分得不是很清楚,下面我通过两段代码让大家看看这两者之间到底有什么区别~~

开发环境: VS.net 2005

使用方法: 用以下代码覆盖program.cs中的代码,然后run即可

第一段代码: Abstract的用法

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
    public abstract class Book
    {
        //抽象方法,不含主体,抽象方法所在类必须为抽象类,派生类必须实现该方法
        public abstract void Introduce();
    }

public interface iBook
    {
    }

public class JavaBook : Book
    {
        //实现抽象方法,必须实现,必须添加override关键字
        public override void Introduce()
        {
            Console.WriteLine("I'm Java");
        }

//            // Compile Error
//            public void Introduce()
//            {
//                Console.WriteLine("I'm Java");
//            }
    }

public class test
    {
        public test()
        {
            JavaBook javaBook = new JavaBook();
            javaBook.Introduce();      //将调用JavaBook中Introduce()
            Book book = new JavaBook();
            book.Introduce();      //将调用JavaBook中Introduce()
        }
        public static void Main()
        {
            test t = new test();
        }
    }
}

第二段代码: Virtual的用法以及override的用法

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
    public abstract class Book
    {
        public virtual void Introduce()
        {
            Console.WriteLine("I'm book");
        }

public virtual void SayHi()
        {
            Console.WriteLine("Hi, I'm book");
        }
    }

public class JavaBook : Book
    {
        public override void Introduce()
        {
            Console.WriteLine("I'm Java");
        }

//注意,此方法没有override父类的方法
        public void SayHi()
        {
            Console.WriteLine("Hi, I'm Java");
        }
    }

public class test
    {
        public test()
        {
            JavaBook javaBook = new JavaBook();
            Book book = new JavaBook();
            javaBook.Introduce();       //将调用JavaBook中Introduce()
            book.Introduce();       //将调用JavaBook中Introduce()

javaBook.SayHi();      //将调用JavaBook中SayHi()
            book.SayHi();           //将调用Book中SayHi()
        }

public static void Main()
        {
            test t = new test();
        }
    }
}

第三段代码: new的用法

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication4
{
    public abstract class Book
    {
        public void Introduce()
        {
            Console.WriteLine("I'm book");
        }

public void SayHi()
        {
            Console.WriteLine("Hi, I'm book");
        }
    }

public class JavaBook : Book
    {
        // 没有加new,但C#默认行为会加上new
        public void Introduce()
        {
            Console.WriteLine("I'm Java");
        }

// 显式加上new,跟不加new实际效果一样,只是加new之后会消除compile warning
        public new void SayHi()
        {
            Console.WriteLine("Hi, I'm Java");
        }
    }

public class test
    {
        public test()
        {
            JavaBook javaBook = new JavaBook();
            Book book = new JavaBook();

javaBook.Introduce();       //将调用JavaBook中Introduce()
            javaBook.SayHi();           //将调用JavaBook中SayHi()
           
            book.Introduce();       //将调用Book中Introduce()
            book.SayHi();           //将调用Book中SayHi()
        }
        public static void Main()
        {
            test t = new test();
        }
    }
}

转载于:https://www.cnblogs.com/0633shj/archive/2009/08/19/1550079.html

(转)C#中的Abstract和Virtual函数区分,因我老弄不明白这个问题,所以转到这儿相关推荐

  1. 转:C#中的abstract与virtual

    C#中的abstract与virtual 2008-03-14 14:01 [abstract] abstract 修饰符可以和类.方法.属性.索引器及事件一起使用. 在类声明中使用 abstract ...

  2. 转载-区分C#中的Abstract函数和Virtual函数

    发现很多朋友对于C#中的Abstract和Virtual函数区分得不是很清楚,下面我通过两段代码让大家看看这两者之间到底有什么区别~~ 开发环境: VS.net 2005 使用方法: 用以下代码覆盖p ...

  3. c#中的interface abstract与virtual的介绍与使用

    abstract 与virtual : 方法重写时都使用 override 关键字,interface中的方法和abstract方法都要求实现. 1:interface用来声明接口 1.1.只提供一些 ...

  4. c#中的interface abstract与virtual

    abstract 与virtual : 方法重写时都使用 override 关键字,interface中的方法和abstract方法都要求实现 interface用来声明接口 1.只提供一些方法规约, ...

  5. C#中Abstract和Virtual的区别

    转自原文 C#中Abstract和Virtual的区别 c# 中 Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用.下面讨论一下二者的区别: 一.Virtua ...

  6. C#中的static,interface,virtual,abstract,override的用法

    C# 是面向对象的程序设计语言,每一个函数都属于一个类. Static:当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现. 也就是说,这个方法属于类,但是不 ...

  7. C#中Abstract和Virtual使用详解

    转载自: https://www.cnblogs.com/vaevvaev/p/6911788.html 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区 ...

  8. (转)C#中Abstract和Virtual

    转:http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的使用, ...

  9. C#中Abstract和Virtual(转载)

    在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...

最新文章

  1. [原创]SparkR针对mysql的数据读写操作实现
  2. Delphi中使用IXMLHTTPRequest如何用POST方式提交带参
  3. Java,JavaFX的流畅设计风格进度栏
  4. 力扣——实现 strStr()
  5. 谷歌发布 Android 11 的第二个开发者预览版
  6. SQL Server 2012 扩展事件(2)体系结构
  7. 迅雷专用下载的几种代码
  8. R语言ggplot2可视化条形图:通过双色渐变配色颜色主题可视化条形图
  9. 配置Becon frame中的Carplay的Interworking和Vendor Specific字段信息
  10. UML 用例图符号含义
  11. 读入一句话(一行文本),统计26个大写字母各自出现的次数。(java)
  12. mysql是怎么存储原理_Mysql数据库存储原理是怎样的
  13. Win10系统“此电脑”误删了,或者无缘无故消失了,怎么找回?
  14. stm32专题二十五:基本定时器原理
  15. librtmp h265 推流
  16. 学习springcloud
  17. 如何更优雅地使用 bilibili(b站)
  18. 电瓶车续航测试软件,寻找真实续航英雄!7款纯电动车续航测试
  19. Xposed模块开发入门,实现修改微信钱包显示的余额
  20. 雷卯推荐TVS低漏流100uA,低电压3.3v,功率400W

热门文章

  1. Express简单路由使用
  2. python元组读取到列表_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...
  3. 骁龙710、675、660、636之间性能差距有多大?
  4. 办信用卡被拒绝是什么原因?
  5. 公交车上应不应该给老人让座?
  6. 你身边有没有“万事不求人”的人?他们后来怎么样了?
  7. 门槛,才是做生意持久盈利的基础
  8. 如何让自己的视频号作品上热门
  9. Qt4_使用QXmlStreamReader读取XML
  10. 前端获取后台保存的Cookie