abstract:

  • 抽象方法是隐式的虚方法
  • 在抽象方法声明中,不能使用static或者virtual修饰符

override:

  • override关键字提供派生类对基类方法的新的实现,重写的基类方法必须和基类的方法有着相同的签名(函数名、返回值、参数列表相同)。
  • override关键字不可以重写基类非virtual修饰的方法和static修饰的静态方法。派生类的override方法重写的基类方法必须是virtual、abstract或者override的。
  • 派生类的override方法和基类的virtual方法必须有相同的访问权限
  • 不能用修饰符new、static、virtual或者abstract修饰override方法。

new:

  • 作为修饰符覆盖父类的方法(不必是虚方法),当使用子类的类型来调用的时候,它会运行子类的函数,而如果类型是基类的话,被隐藏的基类函数会被调用,而子类中函数使用override的时候,则当使用子类的类型来调用的是,它会运行子类的函数,类型是基类的时候,仍会调用子类函数。
 class Car
{
public virtual void DescribeCar()
{
System.Console.WriteLine("Four wheels and an engine.");
}
}
class ConvertibleCar : Car
{
public new void DescribeCar()
{
System.Console.WriteLine("A roof that opens up.");
}
}
class Minivan : Car
{
public override void DescribeCar()
{
System.Console.WriteLine("Carries seven people.");
}
}
public class Program
{
public static void Main()
{
Car car1 = new Car();
car1.DescribeCar();
System.Console.WriteLine("----------"); //Four wheels and an engine.
      ConvertibleCar car2x = new ConvertibleCar();
car2x.DescribeCar();
System.Console.WriteLine("----------"); //A roof that opens up.
          Car car2 = new ConvertibleCar();
car2.DescribeCar();
System.Console.WriteLine("----------"); //Four wheels and an engine.

      Minivan car3x = new Minivan();
car3x.DescribeCar();
System.Console.WriteLine("----------"); //Carries seven people.
      Car car3 = new Minivan(); 
      car3.DescribeCar();
      System.Console.WriteLine("----------"); //Carries seven people.
      System.Console.ReadKey(); } } 

virtual: 

  修饰方法表示允许在派生类中重写这些对象,默认情况下,方法是非虚拟的,不可以重写非虚方法,virtual关键字不可以与static、abstract、private、override一起使用。

  virtual关键字又是和override紧密不可分的,如果要实现virtual方法就必须要使用override或new关键字(上文已经指出new和override产生的机理不同)。

sealed:

  当对一个类应用sealed修饰符时,此修饰符会阻止其他类从该类继承。

  sealed 方法必须与override连用,也就是说实现sealed方法的类的父类必须实现了此方法。

  密封方法重写基类中的方法,但其本身不能在任何派生类中进一步重写

  class X  

    {
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("X.F3"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("C.F"); }//sealed修饰的方法是不允许继承的 // Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}

整体例子:

namespace testVirtualF
{
interface BaseInterface
{
void doWork();
}
public abstract class Base:BaseInterface
{
public virtual void work()
{
Console.WriteLine("基类---现在是上班时间");
}
public virtual void outWork()
{
Console.WriteLine("基类---现在是下班时间");
} public abstract void play();//声明抽象方法,只能在抽象方法中
public abstract void doWork();//实现接口的抽象类,可以将接口方法映射到抽象方法中
} public class Employer:Base
{
public new void work()
{
Console.WriteLine("子类(new)---现在是上班时间");
}
public override void outWork()
{
Console.WriteLine("子类(override)---现在是下班时间");
}
public override void play()
{
Console.WriteLine("子类(override)---父类抽象方法");
}
public override void doWork()
{
Console.WriteLine("父类抽象方法--doWork");
}
}
class Program
{
static void Main(string[] args)
{
/*Employer emp = new Employer();
emp.work();
emp.outWork();
emp.play();*/
/*输出结果
* 子类(new)---现在是上班时间
* 子类(override)---现在是下班时间
*/ /*Employer emp = new Employer();
Base b = (Base)emp;
//b.ID = "123";
b.work();
b.outWork();
b.play();*/
/*执行结果
* 基类---现在是上班时间
* 子类(new)---现在是上班时间
* 子类(override)---现在是下班时间
*/ Base b = new Employer();
b.work();
b.outWork();
b.play();
/*执行结果
* 基类---现在是上班时间
* 子类(new)---现在是上班时间
* 子类(override)---现在是下班时间
*/
}
}
}

  

 

C# onverride、abstract、vitrtual、new、sealed的更多相关文章

  1. sealed、new、virtual、abstract与override 趣解

    1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于 方法或属性时,sealed修饰符必须始终与override一起使用. ...

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

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

  3. 修饰符(static、final、abstract)第二篇

    二.Final 核心:一旦创建,不可修改 可修饰:(创建即终态) 1.类:被修饰后,将不能被继承 2.方法:被修饰后,将不能被覆写 3.属性:被创建,不可修改,且必须赋值(赋值的两种形式): 1.直接 ...

  4. 接口和抽象类:Interface、abstract _【转】

    一.接口 接口是C#中很常见的工具,概念什么的就不说了,这里讲几个值得注意的小地方: 1.接口内部只能有函数.属性和事件的声明: interface IParent { void Show(); st ...

  5. sealed、new、virtual、abstract与override 总结

    1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或属性时,sealed修饰符必须始终与override一起使用. ...

  6. JavaSE(三)之static、final、abstract修饰符

    一.static修饰符 1.1.static变量 在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量. 静态变量和非静态变量的区别            静态变量属于类的,&quo ...

  7. Java中 final、static、abstract区别与联系

    1.static修饰符 static作用于代码块:称作静态代码块(可以初始化static field,不能初始化非static field); static作用于methods: static方法只能 ...

  8. C#基础知识(base、this、new、override、abstract、virtual、static)

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

  9. base、this、new、override、abstract、virtual、static

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

随机推荐

  1. javascript判断对象

    var assert = require('chai').assert; describe('Array', function() { describe('#indexOf()', function( ...

  2. SystemC简介

    SystemC是一种基于C++语言的用于系统设计的计算机语言,是用C++编写的一组库和宏.它是为了提高电子系统设计效率而逐渐发展起来的产物.IEEE于2005年12月批准了IEEE1666-2005标 ...

  3. firefox浏览器不支持复制粘贴(linux)

    在Linux主机下使用firefox在线编辑文章时,提示不支持复制粘贴选项,并给出了解决方法,记录一下 1.先找到本机firefox的配置文件的所在文件夹位置,不知道的请遵循以下步骤 点击菜单栏的帮助 ...

  4. highchart 动态刷新(可用于制作股票时时走势)

    最近项目中要求获取时时的cpu动态图,利用 highchart 可以轻松实现该功能,效果可在此地址查看:动态效果 代码如下: 页面 js 引用: <script src="你项目js的 ...

  5. FP_PR2SAP 除包材、半成品以外的半成品下层物料展望期7天更改为40日

    --除包材.半成品以外的半成品下层物料展望期7天更改为40日 INSERT INTO OUT_PR (pr_id, ITEM, SUPPLIER_ID, DUE_DATETIME, QTY, PROC ...

  6. 【Python全栈笔记】03 [模块二] 16-17 Oct Set 集合,三目运算

    Set 集合 set - unordered collections of unique elements 创建一个set/一个空set # create a new set set1 = {1,2, ...

  7. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(二)kmeans

    (上接第二章) 4.3.1 KMeans 算法流程 算法的过程如下: (1)从N个数据文档随机选取K个文档作为质心 (2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 (3)重新计 ...

  8. js鼠标经过文字滚动,移开还原

    不说别的,直接贴代码. <div class="kj-scroll" id="countrylist0" onmouseover="wPAa = ...

  9. HDMI学习

    市面上大多4K显示器都配备了HDMI 1.4接口,仅能实现30Hz的刷新率,不足以带来流畅的显示效果, 酱紫情况,就算是搭配了HDMI 2.0高清线也是无法发挥其作用.只有更先进的HDMI 2.0标准 ...

  10. iOS中的上传、下载流程心得

    访问相册 1.  判断资源库是否有效 2.  创建imagePickerController 设置代理 弹出视图控制器 3.  实现协议方法 > iOS10 访问系统相册需要在info.plis ...