abstract修饰类名为抽象类,修饰方法为抽象方法。如果一个类为抽象类,则这个类智能是其他某个类的基类。抽象方法在抽象类中没有函数体。抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法。

抽象类有如下特征:

抽象类不能实例化

抽象类的派生类必须实现所有抽象方法

抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法

抽象方法:

抽象方法是隐式的虚方法

只允许在抽象类中使用抽象方法声明

抽象方法在抽象类中没有方法体

在抽象方法声明中,不能使用static或者virtual修饰符

abstract class A //abstract 关键字在class前面

{

public abstract void run();//方法是将关键字abstract 添加到方法的返回类型的前面

}

override关键字提供派生类对基类方法的新的实现,重写的基类方法必须和基类的方法有着相同的签名(函数名、返回值、参数列表相同)。

override关键字不可以重写基类非virtual修饰的方法和static修饰的静态方法。

派生类的override方法和基类的virtual方法必须有相同的访问权限。不能用修饰符new、static、virtual或者abstract修饰override方法。

派生类的override方法重写的基类方法必须是virtual、abstract或者override的。

abstract class A

{

public virtual void MethodA()

{

//do something

}

public abstract void run();

}

public class B:A

{

public override void MethodA()

{

//do somthing

}

public virtual void run()

{

//do something

}

}

new

c#中,new的关键字主要有三个功能:

作为运算符用来创建类的一个对象。 Class obj = new Class();

作为修饰符。

用于在泛型声明中约束可能用作类型参数的参数类型。(这个不太清楚)

在这里主要介绍第2个功能,作为修饰符的作用。

new声明的方法,当使用子类的类型来调用的时候,它会运行子类的函数,而如果类型是基类的话,被隐藏的基类函数会被调用。

而子类中函数使用override的时候,则当使用子类的类型来调用的是,它会运行子类的函数,类型是基类的时候,仍会调用子类函数。

// Define the base class

class Car

{

public virtual void DescribeCar()

{

System.Console.WriteLine("Four wheels and an engine.");

}

}

// Define the derived classes

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("----------");

Car car2 = new ConvertibleCar();

car2.DescribeCar();

System.Console.WriteLine("----------");

Car car3 = new Minivan();

car3.DescribeCar();

System.Console.WriteLine("----------");

System.Console.ReadKey();

}

}

Virtual

virtual 关键字允许在派生类中重写这些对象。默认情况下,方法是非虚拟的,不可以重写非虚方法,virtual关键字不可以与static、abstract、private、override一起使用。virtual关键字又是和override紧密不可分的,如果要实现virtual方法就必须要使用override或new关键字(上文已经指出new和override产生的机理不同)。

Sealed

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

sealed 方法必须与override连用,也就是说实现sealed方法的类的父类必须实现了此方法。      sealed关键字有两个作用:

1 密封类不能被继承。

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

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)---现在是下班时间

*/

}

}

}

abstract、override、new、virtual、sealed使用和示例的更多相关文章

  1. C#--virtual,abstract,override,new,sealed

    virtual:使用此关键字,可以使其在派生类中被重写. abstract:抽象方法,由子类重写,或继续为抽象方法存在,并由其子子类实现. override: 重写父类方法,属性,或事件的抽象实现或虚 ...

  2. error C2253: pure specifier or abstract override specifier only allowed on virtual

    1.用Visual Studio 2012编译下面代码时出现的错误: #define RTC_DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const T ...

  3. virtual abstract override

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...

  4. Delphi 方法:overload、override、virtual、dynamic、abstract

    1.overload 在Pascal语法规则中,同一个UNIT里是不能存在两个同名的函数的,例如: function func(): Boolean; function func(const x: C ...

  5. 浅析C#中new、override、virtual关键字的区别

    Virtual : virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写. 默认情况下,方法是非虚拟的.不能重写非虚方法. virtual 修饰符不能与 stati ...

  6. 快学Scala 第十九课 (trait的abstract override使用)

    trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...

  7. c#中abstract、override、new、virtual、sealed使用和示例

    原文地址:http://blog.csdn.net/richerg85/article/details/7407544 abstract      修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽 ...

  8. C#--virtual,abstract,override,new,sealed修饰符学习

    1.参考博客  http://www.cnblogs.com/oneword/archive/2009/07/02/1515279.html http://www.cnblogs.com/mygood ...

  9. virtual abstract override new 几点学习

    1.Vitual方法和普通方法区别为:继承其的子类可以用override/new在重载此方法,也可以不重载其方法,有方法体(可以写语句),override修饰则调用子类方法2.abstract类中抽象 ...

随机推荐

  1. Qt5:窗口各类位置

    在Qt程序中获取窗口位置的函数有  geometry()   ,   frameGeometry()  , pos() ,x() , y()等 下面来看看这些函数的区别 还有另外两个函数 size() ...

  2. 'xcopy' 'ipconfig'。。。 不是内部或外部命令,也不是可运行的程序 或批处理文件

    最近在win8下安装软件的时候,总是报 "xxx不是内部或外部命令,也不是可运行的程序 或批处理文件" 的错误 . 百思不得其解  打开cmd 或 powerShell 输入xco ...

  3. sql server 字符串替换函数REPLACE

    sql server 字符串替换函数REPLACE函数的使用 <pre name="code" class="sql">--参数1:需要替换字符的母 ...

  4. css hack总结

    虽然说,现在讨论css hanck已经过时了,不过了解下还是好的. 各游览器常用兼容标记一览表: 标记 IE6 IE7 IE8 FF Opera Sarari [*+><] √ √ X X ...

  5. 未在本地计算机上注册“Microsoft.Ace.OleDB.12.0”

    这是异常 我的电脑室x86的所以选择x86.

  6. docker固定IP地址重启不变

    docker固定IP地址重启不变 代码地址 https://github.com/lioncui/docker-static-ip 宿主机IP为  10.6.17.12 docker IP为 10.6 ...

  7. ckeditor_3.6.6.2+CKFinder2.0.2配置

    一.首先工具的下载,找到相应的版本进行下载     ckeditor_3.6.6.2+CKFinder2.0.2 http://ckeditor.com/download      打开war文件,然 ...

  8. (简单) POJ 1502 MPI Maelstrom,Dijkstra。

    Description BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odysse ...

  9. ELF文件格式分析--结构篇

    ELF文件格式,全称为Excutable and Linking Format,是一个开放的可执行文件和链接文件格式,在LINUX上很流行,跨平台软件的设计也多以ELF格式作为标准,其结构扩展性兼容性 ...

  10. CSS重设(reset)

    在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览器都能够理解和适用多有CSS规则,并且呈现相同的视 ...