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. Nvelocity用法

    NVelocity用法 NVelocity是一个基于.NET的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定 ...

  2. MYBATIS 文档

    http://www.mybatis.org/mybatis-3/zh/index.html

  3. 配置BUG-Linux系统下ssh登陆很慢的解决办法

    很多的Linux用户发现连接上Linux服务器在输入用户名之后还要再等一下才能输入密码,时间过长了,现在小编与大家分享一下如何解决ssh登陆问题的问题,希望对您有所帮助 . 1.我们平时登陆Linux ...

  4. ROC曲线、AUC、Precision、Recall、F-measure理解及Python实现

    本文首先从整体上介绍ROC曲线.AUC.Precision.Recall以及F-measure,然后介绍上述这些评价指标的有趣特性,最后给出ROC曲线的一个Python实现示例. 一.ROC曲线.AU ...

  5. Ubuntu 安装 mysql 并修改数据库目录

    . . . . . 今天折腾了一下午的时间,恢复了无数次虚拟机快照,终于在 Ubuntu 上把 mysql 安装好了. mysql 是从官网下载的:mysql-server_5.7.16-1ubunt ...

  6. html之如何让文字两端对齐

    text-align: justify;/*英文*/ text-align-last: justify;/*中英文*/ text-align-last: justify;亲测有效(chrome)

  7. java验证码刷新

    可以使用a标签,这样省事 <img id="code_img" src="validcode" alt="登录验证码" /> & ...

  8. 关于imagic拼接透明背景图片的问题

    目标: 为了做图片水印,需要水平拼接多个logo和文字... 之前用过imagick,所以继续使用. 第一个版本:实现了图片和文字的拼接,代码如下: package main import ( &qu ...

  9. FluentValidation验证

    参考:http://www.c-sharpcorner.com/UploadFile/3d39b4/Asp-Net-mvc-validation-using-fluent-validation/ 创建 ...

  10. Codeforces 734E. Anton and Tree 搜索

    E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...