zoukankan      html  css  js  c++  java
  • C# abstract ,virtual ,override,new --比较好的文章

    http://www.cnblogs.com/notifier/archive/2010/05/14/1735235.html

    1.  C#中方法覆盖时override和new的比较

         C#中override关键字使用在虚函数(virtual method)和抽象函数(abstract method)的覆盖上;

         C#中new关键字使用在派生类覆盖父类的"普通"函数上(也就是说非虚函数非抽象函数的情境下) 

         下面是代码示例:(override的用法见下面abstract和virtual比较的章节)

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace ConsoleApplication4
    {
    publicabstractclass Book
    {
    publicvoid Introduce()
    {
    Console.WriteLine(
    "I'm book");
    }

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


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


    publicclass 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()
    }
    publicstaticvoid Main()
    {
    test t
    =new test();
    }
    }
    }
    复制代码

    2.  C#中abstract和virtual的比较

         abstract方法(抽象方法)和Java中的使用是一致的,至少我现在是这么理解.

         virtual是C#中为了实现运行时多态而加的机制,上面有提到,子类可以覆盖父类的函数(使用override)从而实现多态.

         这里岔个话题,笔记一下C#中多态的实现:C#中多态的实现分为了两种,一种是编译时多态,一种是运行时多态

             |- 编译时多态  通过一个类中多个方法的重载来实现的多态,系统在编译的时候,根据传递的参数确定具体调用哪个重载的方法;

             |- 运行时多态  通过virtual函数(虚函数)、抽象方法实现的多态,派生类去override虚函数或抽象方法,从而实现运行时多态.

         具体实例代码如下:

    第一段代码: abstract的用法

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Text;

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

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


    publicclass test
    {
    public test()
    {
    JavaBook javaBook
    =new JavaBook();
    javaBook.Introduce();
    //将调用JavaBook中Introduce()
    Book book =new JavaBook();
    book.Introduce();
    //将调用JavaBook中Introduce()
    }
    publicstaticvoid Main()
    {
    test t
    =new test();
    }
    }
    }
    复制代码

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

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace ConsoleApplication2
    {
    publicabstractclass Book
    {
    publicvirtualvoid Introduce()
    {
    Console.WriteLine(
    "I'm book");
    }

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


    publicclass JavaBook : Book
    {
    publicoverridevoid Introduce()
    {
    Console.WriteLine(
    "I'm Java");
    }

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


    publicclass 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()
    }

    publicstaticvoid Main()
    {
    test t
    =new test();
    }
    }
    }
    复制代码
  • 相关阅读:
    豆瓣还是能学到东西的!
    Mip-Mapping很重要
    果然还是SB了
    Don't Starve,好脚本,好欢乐
    Soft Renderer的乐趣
    java classloader原理深究
    用gitolite搭建git server
    神话设计模式 --开端
    Dive into Spring framework -- 了解基本原理(二)--设计模式-part2
    Dive into Spring framework -- 了解基本原理(二)--设计模式-part1
  • 原文地址:https://www.cnblogs.com/runliuv/p/2974945.html
Copyright © 2011-2022 走看看