简单易懂的解释c#的abstract和virtual的用法和区别

摘要:
先来看abstract方法,顾名思义,abstract方法就是抽象方法。形如:abstractclassTestAbstractSuper3、抽象类不能被实例化,只能被继承。再说virtual,他有几个特点:1、声明了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. usingSystem;  
    usingSystem.Collections.Generic;  
    usingSystem.Linq;  
    usingSystem.Text;  
    usingSystem.Diagnostics;  
    namespaceTestAppAllHere  
    {  
        abstract classTestAbstractSuper  
        {  
            publicTestAbstractSuper()   
            {  
                Debug.WriteLine("这是父类的构造方法");  
            }  
            public abstract voidInit();  
            public voidHello()   
            {  
                Debug.WriteLine("这是父类的非抽象方法");  
            }  
        }  
    }  

抽象类的子类:

  1. usingSystem;  
    usingSystem.Collections.Generic;  
    usingSystem.Linq;  
    usingSystem.Text;  
    usingSystem.Diagnostics;  
    namespaceTestAppAllHere  
    {  
        classTestAbstractSub:TestAbstractSuper  
        {  
            publicTestAbstractSub()   
            {  
                Debug.WriteLine("这是子类的构造方法");  
            }  
            public override voidInit()  
            {  
                Debug.WriteLine("这是子类重写的方法");  
            }  
        }  
    }  

调用代码:

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

输出:

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

父类:

  1. usingSystem;  
    usingSystem.Collections.Generic;  
    usingSystem.Linq;  
    usingSystem.Text;  
    usingSystem.Diagnostics;  
    namespaceTestAppAllHere  
    {  
        classTestVirtualSuper  
        {  
            publicTestVirtualSuper()   
            {  
                Debug.WriteLine("这是父类的构造方法");  
            }  
            public virtual voidInit()   
            {  
                Debug.WriteLine("这是父类的虚拟方法");  
            }  
        }  
    }  

子类:

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

调用代码:

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

输出:

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

免责声明:文章转载自《简单易懂的解释c#的abstract和virtual的用法和区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于日志记录的一些感想我的Cocos2d-x学习笔记(七)纹理缓存、帧缓存、精灵的创建、zOrder下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

javase:习题

1、下来说法正确的是? A、JAVA程序的main方法必须写在类里面 B、JAVA程序中可以有多个main方法 C、JAVA程序中类名必须与文件名一样 public class Mytest { public class Animal{ } public class Plants{ } }...

浅谈php 抽象类abstract和接口interface

一、抽象类(abstract) 抽象类定义的规范 1、php5支持抽象类和抽象方法 2、定义得抽象类无法被实例化 3、任何一个类里面声明了抽象方法,那么这个类必须声明为抽象类, 一个抽象类可以没有抽象方法 4、被定义得抽象方法只能声明其调用方式(参数),不能定义其具体得功能实现 5、继续抽象类的子类必须定义父类(抽象类)所有的抽象方法,并且访问控制(pub...

Spring框架之jdbc源码完全解析

Spring框架之jdbc源码完全解析        Spring JDBC抽象框架所带来的价值将在以下几个方面得以体现:        1、指定数据库连接参数        2、打开数据库连接        3、声明SQL语句        4、预编译并执行SQL语句        5、遍历查询结果(如果需要的话)        6、处理每一次遍历操作...

【WPF】2、美化控件

控件有默认样式,但是有时候默认样式并不够用,就需要美化。 1、常用的方法是美术出图,直接贴图进去,效果又好又简单(对程序来说)。 用图片有三种方式:设置控件背景图片、设置控件内容为图片和直接使用图片做控件三种。 <Window x:Class="战五渣之环游世界.WPF.Window1" xmlns="http://schemas....

第八章 Python 对象和类

一、什么是对象 在 Pyth 中,对象就是经过实例化的,具体可以操作的一组代码的组合; 对象一般包含数据(变量,更习惯称之为属性 attribute),也包含代码(函数,也称之为方法) 当你想要创建一个别人从来都没有创建过的新对象时,首先必须定义一个类,用以指明该类型的对象所包含的内容(属性和方法) 可以把对象想象成 名词 ,那么方法就是动词。对象代表着一...

Java基础知识提要

1、简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机、冰箱等 2、简单写出Java特点,写出5个以上,越多越好 简单的、面向对象的、分布式的、安全的、稳定的、与平台无关的、可解释的、多线的、动态的语言。 3、什么是Java? JAVA:一种编程...