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,但非强制。 

    上代码: 

     
    1. //_______________________________________abstract____________________________________________//   

    父类-抽象类: 

    1. 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("这是父类的非抽象方法");  
              }  
          }  
      }  

    抽象类的子类: 

     
    1. 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("这是子类重写的方法");  
              }  
                
          }  
      }  

    调用代码:

     
    1. <span style="white-space:pre">    </span>    TestAbstractSub sub = new TestAbstractSub();  
                  sub.Init();  
                  sub.Hello();  

    输出:

     
    1. 这是父类的构造方法  
      这是子类的构造方法  
      这是子类重写的方法  
      这是父类的非抽象方法    
     
    1. //_______________________________________virtual____________________________________________//  

    父类: 

     
    1. 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("这是父类的虚拟方法");  
              }  
          }  
      }  

    子类:

     
    1. 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("这是子类的重写方法");  
              }  
        
          }  
      }  

    调用代码: 

     
    1. <span style="white-space:pre">    </span>    TestVirtualSub sub = new TestVirtualSub();  
                  sub.Init();  

    输出: 

     
      1. 这是父类的构造方法  
        这是子类的构造方法  
        这是子类的重写方法  
  • 相关阅读:
    sc delete 服务器名提示“指定的服务已经标记为删除”
    visio2007无法拖动
    Oracle 时间相减得出毫秒、秒、分、时、天,,【转】
    服务启动错误1053解决方案之一
    【转】oracle 删除重复记录
    利用VS2013 XSLT对 XML进行转换
    xpath属性值的模糊匹配
    android 与 小米1S刷机学习
    如何添加打印机
    SVN学习(一)——SVN 检出文件步骤、图标显示及含义
  • 原文地址:https://www.cnblogs.com/vaevvaev/p/6911820.html
Copyright © 2011-2022 走看看