先来看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

简单易懂的解释c#的abstract和virtual的用法和区别的更多相关文章

  1. C#中Abstract和Virtual的区别

    c# 中 Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用.下面讨论一下二者的区别: 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰 ...

  2. C#中Abstract和Virtual

    C#中Abstract和Virtual 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Vi ...

  3. Abstract和Virtual和interface , 派生类中重写 override / new关键字

    http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...

  4. C#基础知识系列七(base、this、new、override、abstract、virtual、static)

    前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...

  5. 基础知识系列☞Abstract和Virtual→及相关知识

    转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...

  6. [C#] 區分 abstract、virtual、override 和 new

    abstract.virtual.override和new是在類別的繼承關係中常用的四個修飾方法的關鍵字,在此略作總結. 1. 常用的中文名稱: n   abstract => 抽象方法. n  ...

  7. c#中的interface abstract与virtual

    interface用来声明接口1.只提供一些方法规约,不提供方法主体  如  public interface IPerson {  void getName();//不包含方法主体  }2.方法不能 ...

  8. C#中Abstract和Virtual 【转】

    http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在 ...

  9. abstract、virtual、sealed

    abstract与virtual前必有public 1.abstract,抽象 1)只要使用到了abstract定义了方法,那么类就一定得用abstract定义,public abstract,只有抽 ...

随机推荐

  1. Python操作Excel 之 openpyxl

    一.基础 安装openpyxl 模块 pip install openpyxl 或者通过轮子安装 font(字体类):字号.字体颜色.下划线等 fill(填充类):颜色等 border(边框类):设置 ...

  2. vue.js实战——.native修饰符

    https://blog.csdn.net/qq_29468573/article/details/80771625 除了用v-on在组件上监听自定义事件外,也可以监听DOM事件,这时可以用.nati ...

  3. window.open() & iframe & tab

    window.open() & iframe & tab window.open() open pages in the same window / tab https://stack ...

  4. 使用nio遍历文件夹

    1.递归方式: private static void print(File f){ if(f!=null){ if(f.isDirectory()){ File[] fileArray=f.list ...

  5. celery概述

    celery介绍 Celery是一个功能完备即插即用的任务队列.它使得我们不需要考虑复杂的问题,使用非常简单.celery看起来似乎很庞大,本章节我们先对其进行简单的了解,然后再去学习其他一些高级特性 ...

  6. 入坑MATLAB必会的吐血总结

    本渣想回过头来整理一下MATLAB的一些基本的知识(很多东西比较琐碎,应该系统的梳理梳理),下文中没有提到的,自己用help查即可. 此文用来存个档,便于回顾. 由于matlab各版本部分语法存在差异 ...

  7. Python_003_Python循环控制

    ♥3.1  顺序结构 程序中语句执行的基本顺序按各语句出现位置的先后次序执行 ♥3.2  选择结构 主要理解一下if语句的使用即可,单分支 .双分支.多分支以及if语句的嵌套. ♥3.3  循环结构 ...

  8. 51nod1237 最大公约数之和

    题目链接 题意 其实就是求 \[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\] 思路 建议先看一下此题的一个弱化版 推一下式子 \[\sum\limi ...

  9. C# http 性能优化500毫秒到 60 毫秒

    偶然发现 C# 的 HttpRequest 要比 Chrome 请求同一Url 慢好多.C# HttpRequest 要500毫秒 而Chrome 只需要 39ms. 作为有责任感的 码农.这个 必须 ...

  10. Inheritance: 'A' is an inaccessible base of 'B'

    'boost::enable_shared_from_this<net::Session>' is an inaccessible base of 'net::Session' BOOST ...