惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
博客园_首页
WordPress大学
WordPress大学
罗磊的独立博客
小众软件
小众软件
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
The Cloudflare Blog
GbyAI
GbyAI
C
Check Point Blog
腾讯CDC
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
博客园 - 聂微东
IT之家
IT之家
雷峰网
雷峰网
H
Help Net Security
博客园 - 叶小钗
美团技术团队
D
DataBreaches.Net

博客园 - 鱼跃千里

Python抽奖程序 - 鱼跃千里 - 博客园 右键菜单添加CMD--备忘 - 鱼跃千里 - 博客园 windows 7安装sql server2005以及com (-1073737712错误)+ 8004e00f错误 Nhibernate 2.0 学习笔记,关于hbm映射文件的重要性 要签约了 腾讯笔试 IE7不能支持Google的Google Suggest? 两个不错的生成图片验证码代码 继承类实例化时构造函数的执行顺序 FCKEditor的使用---起步 [转+自己修改]将 MS SQL Server 2005 SP2 整合到安装文件 Google AdSense 申请通过了 [转]发生 LC.exe 已经退出 代码-1 错误的解决方法 [转]VS2005 SP1集成版制作 DataList等控件嵌套绑定的一个需要注意的地方 为DataList和GridView内容项添加序号 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 (.Net SqlClient Data Provider) [转]最佳ASP.NET编程习惯 DataList嵌套绑定数据
[转]虚方法和抽象方法
鱼跃千里 · 2008-10-12 · via 博客园 - 鱼跃千里

       看你必须知道的.net,在多态和接口那一块的时候,由于多态那里说了很多遍虚方法,接口那里列了一个接口的IL代码,说接口中实际是提供了一个abstract virtual方法,发现自己搞不清虚方法和抽象方法的区别了,百度到一篇,特转来此。

原文

抽象方法   
   使用abstract关键字    public    abstract    bool    Withdraw(…);   
   抽象方法是必须被派生类覆写的方法。   
   抽象方法是可以看成是没有实现体的虚方法   
   如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法   
    
   虚方法   
   使用virtual关键字    public    virtual    bool    Withdraw(…);   
   调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。   
   虚方法可以有实现体

若一个实例方法的声明中含有        virtual        修饰符,则称该方法为虚拟方法;一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法;在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。         
            
       虚函数的限制:         
            
       1.虚函数仅适用于有继承关系的类对象,        所以只有类的成员函数才能说明为虚函数.             
       2.静态成员函数不能是虚函数.             
       3.内联函数不能是虚函数.             
       4构造函数不能是虚函数.             
       5.析构函数可以是虚函数.

简单点说,抽象方法是需要子类去实现的.虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖取决于需求.   
   如   
   public    abstract    class    AUser   
   {   
           public    abstract    UserInfo    getUser();   
           public    virtual    void    Save(UserInfo    info)   
           {   
                   //实现保存的功能   
           }   
   }   
    
   public    class    UserSqlServer:AUser   
   {   
           public    override    UserInfo    getUser()   
           {   
                     //一定要实现的,抽象类只给了抽象方法   
           }   
           //假设抽象类针对SqlServer实现的功能,这里不需要实现了.   
   }   
    
   public    class    UserOracle:AUser   
   {   
           public    override    UserInfo    getUser()   
           {   
                     //一定要实现的,抽象类只给了抽象方法   
           }   
           //假设抽象类针对Oracle实现的功能   
           public    override    void    Save(UserInfo    info)   
           {   
                     //覆盖抽象类中的Save方法   
           }   
   }   
   以上只是例子,真实并不这么做.