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 ...
随机推荐
- Java:基于LinkedList实现栈和队列
1.提供一组栈的接口,其底层关联到一个LinkedList(双端队列)实例.由于只暴露部分基于栈实现的接口,所以可以提供安全的栈实现. package junit; import java.util. ...
- table变色
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- 团队编程——web应用之人事管理系统
本次作业为团队作业,团队博客要求如下:1. 介绍团队情况:包括队长.成员.队名.成员照片.队训--.等:2. 介绍团队项目名称.总体任务,各成员任务等:3. 每个队做 一次需求调研(针对团队项目),要 ...
- C#删除datable空行
//去除dataTable空行 public DataTable RemoveEmpty(DataTable dt) { List<DataRow> removelist = new Li ...
- plsql很好用的自定义设置【转载】
本文是转载的,目的是方便自已随时可以查看.转载地址:http://blog.itpub.net/24496241/viewspace-740917/ 目的:方便自已随时可以查看 1.格式化SQL语句在 ...
- Java中public,private,protected,和默认的区别
Java中public,private,protected,和默认的区别 1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以 ...
- Brophp框架开发时连接数据库读取UTF8乱码的解决(转)
Brophp框架开发时连接数据库读取UTF8乱码的解决办法 (2012-09-15 10:41:22) 转载▼ 标签: 杂谈 it php 分类: 建站技术 Brophp框架开发时连接数据库读取UTF ...
- C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命
使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...
- Highchart URL
http://www.highcharts.com/stock/demo/flags-general http://www.codesec.net/view/217265.html http://js ...
- Java泛型 E、T、K、V、N
中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ...