zoukankan      html  css  js  c++  java
  • 简单易懂的解释c#的abstract和virtual的用法和区别

    先来看abstract方法,顾名思义,abstract方法就是抽象方法。

    1、抽象方法就是没有实现的,必须是形如:

    public abstract void Init();  

    2、拥有抽象方法的类必须修饰一个abstract关键字从而变成一个抽象类;但是反过来,抽象类里面不一定要有抽象方法,比如我写了一个非抽象类,但是这个类我不想让人直接实例化,而只让人继承,我就可以把他变成一个抽象类,虽然他里面并没有抽象方法。形如:

    abstract class TestAbstractSuper  

    3、抽象类不能被实例化,只能被继承。

    4、抽象类的子类必须实现每个抽象方法。

    5、抽象类里面除了可以有抽象方法以外,也可以有普通的方法。

    6、抽象类的构造函数可以省略,编译器会自动加上,但是不能是一个抽象方法,而只能是一个普通的构造函数。

    小结:简单概括一下,抽象类不可以直接实例化,他可以有n个(n>=0)抽象方法,这些抽象方法子类必须实现。

    再说virtual,他有几个特点:

    1、声明了virtual的方法无需去改动类的声明,他只在此方法上起到影响。

    2、只有virtual的方法可以被子类override。

    3、子类可以不ouverride父类的virtual方法,这种情况下他就像普通的父类方法一样。

    小结:简单概括一下,virtual关键字就是告诉子类,此方法可以被override,但非强制。

    上代码: 

    //_______________________________________abstract____________________________________________//

    父类-抽象类:

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    using System.Diagnostics;  
      
    namespace TestAppAllHere  
    {  
        abstract class TestAbstractSuper  
        {  
            public TestAbstractSuper()   
            {  
                Debug.WriteLine("这是父类的构造方法");  
            }  
      
            public abstract void Init();  
      
            public void Hello()   
            {  
                Debug.WriteLine("这是父类的非抽象方法");  
            }  
        }  
    }  

    抽象类的子类:

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    using System.Diagnostics;  
      
    namespace TestAppAllHere  
    {  
        class TestAbstractSub:TestAbstractSuper  
        {  
            public TestAbstractSub()   
            {  
                Debug.WriteLine("这是子类的构造方法");  
            }  
      
            public override void Init()  
            {  
                Debug.WriteLine("这是子类重写的方法");  
            }  
              
        }  
    }  

      

    调用代码:

    TestAbstractSub sub = new TestAbstractSub();  
    sub.Init();  
    sub.Hello();  

    输出:

    这是父类的构造方法  
    这是子类的构造方法  
    这是子类重写的方法  
    这是父类的非抽象方法  

     //_______________________________________virtual____________________________________________//  

    父类:

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    using System.Diagnostics;  
      
    namespace TestAppAllHere  
    {  
        class TestVirtualSuper  
        {  
            public TestVirtualSuper()   
            {  
                Debug.WriteLine("这是父类的构造方法");  
            }  
            public virtual void Init()   
            {  
                Debug.WriteLine("这是父类的虚拟方法");  
            }  
        }  
    }  


    子类: 

    using System;  
    
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    using System.Diagnostics;  
      
    namespace TestAppAllHere  
    {  
        class TestVirtualSub:TestVirtualSuper  
        {  
            public TestVirtualSub()  
            {  
                Debug.WriteLine("这是子类的构造方法");  
            }  
            //___________________没有重写这个虚拟方法也是可以照常运行的,会调用父类的虚拟方法_________________________  
            //___________________重写了之后父类的虚拟方法不会运行,而是重写,当然可以用base.来调用父类的方法__________  
            public override void Init()  
            {  
                //base.Init();  
                Debug.WriteLine("这是子类的重写方法");  
            }  
      
        }  
    }  
     

    调用代码: 

    TestVirtualSub sub = new TestVirtualSub();  
    sub.Init();  

    输出: 

    这是父类的构造方法  
    这是子类的构造方法  
    这是子类的重写方法  

    转自:http://blog.csdn.net/wzj0808/article/details/51388034

  • 相关阅读:
    【Android Developers Training】 73. 布局变化的动画
    【Android Developers Training】 72. 缩放一个视图
    【Android Developers Training】 71. 显示翻牌动画
    svn更改地址怎么办
    python学习手册
    failed to bind pixmap to texture
    Ubuntu 12.04安装Google Chrome
    svn update 时总是提示 Password for '默认密钥' GNOME keyring: 输入密码
    重设SVN 的GNOME keyring [(null)] 的密码
    Nginx + uWSGI + web.py 搭建示例
  • 原文地址:https://www.cnblogs.com/eric-qin/p/8571821.html
Copyright © 2011-2022 走看看