zoukankan      html  css  js  c++  java
  • 转载区分C#中的Abstract函数和Virtual函数

    发现很多朋友对于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();
            }
        }
    }

  • 相关阅读:
    ParallelsDesktop在windows 10虚拟机重启后分辨率无法保存的问题解决方案
    Windows10 2021年5月功能更新(21H1)的三种方式
    Database "mem:XXX" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 90149/90149 解决方案
    Win7/8下提示OpenSCManager failed 拒绝访问 解决方案
    将 Windows 更新代理更新到最新版本
    解决Eclipse中无法直接使用sun.misc.BASE64Encoder及sun.misc.BASE64Decoder的问题
    【Windows】U 盘装系统,无法格式化所选磁盘分区[错误: 0x8004242d]解决方案
    Boot Camp列表-苹果电脑Windows驱动下载
    selenium4 Timeouts is deprecated
    Selenium4实践1——对比Selenium3,Selenium4更新了什么?
  • 原文地址:https://www.cnblogs.com/dwjaissk/p/565826.html
Copyright © 2011-2022 走看看