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. java -json()

    json-lib和org.json的使用几乎是相同的,我总结出的区别有两点: 两种包 1. List集合转换成json方法 List list = new ArrayList(); list.add( ...

  2. linq andregex

  3. 转载:Solr的自动完成实现方式(第三部分:Suggester方式续)

    转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269126.html 在之前的两个部分(part1.part2)中,我们学会了如何配置和 ...

  4. [MVC] DIV 布局

    [MVC] DIV 布局 <style> .top { background-color: red; height: 50px; top: 0px; position: absolute; ...

  5. java序列化深拷贝

    java深拷贝 序列化和反序列化合成在一起的方法CloneUtils import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...

  6. mysql 行转列 和 列转行

    我们有时会将一些数据已逗号的连接方式存在数据库,当取出时我们又想单独一个个取出来 利用help_topic 的自增性 LENGTH(wu.`password`) - length(replace(wu ...

  7. ArcMap 操作笔记

    1.SQL查询(in) select * from table where PointID in ('1','2')

  8. openvpn安装

    1,wget http://swupdate.openvpn.org/as/openvpn-as-2.0.10-CentOS7.x86_64.rpm 2,passwd openvpn

  9. Android 获取当前时间问题1

    获取的写法如下: Calendar c = Calendar.getInstance();//可以对每个时间域单独修改 int year = c.get(Calendar.YEAR); int mon ...

  10. R语言画全基因组关联分析中的曼哈顿图(manhattan plot)

    1.在linux中安装好R 2.准备好画曼哈顿图的R脚本即manhattan.r,manhattan.r内容如下: #!/usr/bin/Rscript #example : Rscript plot ...