C# onverride、abstract、vitrtual、new、sealed
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的更多相关文章
- sealed、new、virtual、abstract与override 趣解
1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于 方法或属性时,sealed修饰符必须始终与override一起使用. ...
- C#基础知识系列七(base、this、new、override、abstract、virtual、static)
前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...
- 修饰符(static、final、abstract)第二篇
二.Final 核心:一旦创建,不可修改 可修饰:(创建即终态) 1.类:被修饰后,将不能被继承 2.方法:被修饰后,将不能被覆写 3.属性:被创建,不可修改,且必须赋值(赋值的两种形式): 1.直接 ...
- 接口和抽象类:Interface、abstract _【转】
一.接口 接口是C#中很常见的工具,概念什么的就不说了,这里讲几个值得注意的小地方: 1.接口内部只能有函数.属性和事件的声明: interface IParent { void Show(); st ...
- sealed、new、virtual、abstract与override 总结
1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或属性时,sealed修饰符必须始终与override一起使用. ...
- JavaSE(三)之static、final、abstract修饰符
一.static修饰符 1.1.static变量 在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量. 静态变量和非静态变量的区别 静态变量属于类的,&quo ...
- Java中 final、static、abstract区别与联系
1.static修饰符 static作用于代码块:称作静态代码块(可以初始化static field,不能初始化非static field); static作用于methods: static方法只能 ...
- C#基础知识(base、this、new、override、abstract、virtual、static)
前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...
- base、this、new、override、abstract、virtual、static
前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和s ...
随机推荐
- adb无法使用,提示error: unknown host service的解决办法
此时,需要辨别电脑的5037端口被哪个应用程序占用的方法:(使用adb时需要5037端口是空闲的) 1. 打开命令行,输入命令:netstat -ano |findstr "5037&quo ...
- VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)
之前写的一个VC应用程序,是程序启动时就直接出现在任务栏, 窗体不出现,等用户点击任务栏图标再出现窗口.和一些防火墙什么的软件类似. 这种效果实现并不是很困难的,硬是找不到最好的.为什么呢? 首先,在 ...
- 利用qmake生成Makefile文件
在linux下写程序,免不了要写Makefile文件,用automake,总感觉比较麻烦,linux人喜欢做麻烦的事,以显得风格迥异. 其实用qmake生成Makefile文件相当简单. 1 装好qm ...
- asp.net Ajax和web services
新建一个web服务 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...
- vim 标记 mark 详解 (转载)
http://www.cnblogs.com/jianyungsun/archive/2011/02/14/1954057.html Vim 允许你在文本中放置自定义的标记.命令 "ma&q ...
- iOS的架构
根据多年的iOS开发经验,常用的iOS开发架构有:MVC.MVVM.CDD等,在这里我就不一一列举了. 做一个项目一般首先要搭建主流框架界面:常见的有TabBar控制器可以切换子控制器,上面又有Nav ...
- mysql分表和表分区详解
为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...
- [整理]S-Record数据格式解析
S-Reord是一种由摩托罗拉公司创建的文件格式(不得不说,摩托罗拉厉害啊,SPI和S-Record都是他们创造的).S-Record的基本字符为ASCII字符,用以表示相应的十六进制数据.该数据格式 ...
- call
-------siwuxie095 call 调用另一个批处理程序或自身程序段,调用完,程序会回到原来 call 的地方继续执行 如果在脚本或批处理文件外使用 call,则不会在命令行起作用 语法 c ...
- C#多线程实现方法
C#中实现线程应用开发的类都包含在了System.Threading命名空间中,比较常用的是Thread,ThreadPool类 Thread类构造函数作用是创建线程,有两个重载版本,一个带参数,一个 ...