鱼跃千里

 

[转]虚方法和抽象方法

       看你必须知道的.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方法   
           }   
   }   
   以上只是例子,真实并不这么做.  

posted on 2008-10-12 22:10  鱼跃千里  阅读(376)  评论(0编辑  收藏  举报

导航