- 浏览: 2162784 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
C#支持单继承,说到继承就不得不说new,virtual和override这三个关键词,灵活正确的使用这三个关键词,可以使程序结构更加清晰,代码重用性更高。
以下是msdn中对new,virtual和override的定义:
使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。
virtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟的。不能重写非虚方法。
不能将virtual 修饰符与以下修饰符一起使用:
static abstract override
使用 override 修饰符来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。
重写声明不能更改虚方法的可访问性。重写方法和虚方法必须具有相同的访问级修饰符。
不能使用下列修饰符修改重写方法:
new static virtual abstract
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、抽象的或重写的。
可以稍微归纳一下:
1. 对于基类中说明为虚的方法则必须在派生类中new或者override(注:对于基类的虚方法,虽然你在派生类中即不new也不override,但系统还是会提示你添关键字。否则系统将视其为隐藏。我们的意思是一样的,但总觉得明明确确写上关键字还是好些)。
2. 如果用基类指针指向派生类对象的方式,动态匹配的源动力是virtual,而new和override都会阻止这种向下寻求匹配的行为,所以要使虚函数的性质得已保持下去,就要隐藏基类的虚方法,即在派生类中隐藏基类虚方法时,同时加以virtual关键字,使在多层次继承中能够调用到对象自身的版本。
3.在多层次继承中,三个关键字使用次序有限定,new没有使用前提,即不管是普通方法、虚方法还是重写了的方法。virtual的使用,在它的基类不能有函数签名相同的方法,否则系统将提示添加new,即隐藏基类中的方法。virtual一般只出现一次,除非要在子类中隐藏父类的虚方法。
override的使用是为了重写基类虚方法。
上面的描述都很抽象,对于初学者可能不好理解,下面我将用示例来说明这三个用法和区别:此程序在vs2005下调试通过。其中有三个类,分别
为基类BaseClass,继承类InheritClass和继承类的继承类GrandsonClass代码分别如下:
Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->//BaseClass.cs
namespace NewVirtualOverride
{
class BaseClass
{
public BaseClass()
{
}
public void Print()
{
Console.WriteLine("BaseClassPrint");
}
}
}
//InheritClass.cs
namespace NewVirtualOverride
{
class InheritClass : BaseClass
{
public InheritClass():base()
{
}
public void Print()
{
Console.WriteLine("InheritClassPrint");
}
}
}
//GrandsonClass.cs
namespace NewVirtualOverride
{
class GrandsonClass : InheritClass
{
public GrandsonClass():base()
{
}
public void Print()
{
Console.WriteLine("GrandsonClassPrint");
}
}
}
//最后是主程序Program:
namespace NewVirtualOverride
{
class Program
{
static void Main(string[] args)
{
BaseClass baseclass = new BaseClass();
baseclass.Print();
InheritClass inheritClass = new InheritClass();
inheritClass.Print();
Console.ReadLine();
}
}
}
Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->class InheritClass:BaseClass
{
public InheritClass():base()
{}
//New Virtual Override InheritClass.Print()隐藏了继承的成员
//New Virtual Override BaseClass.Print()。如果是刻意隐藏请使用new
public void Print()
{
Console.WriteLine("Hello");
}
}
虽然结果与用new修饰符差不多,,但是其中的含意可不同,new是继承类对基类方法的重写而在继承类中产生新的方法,这时基类方法和继承方法之间没有任何的关系了,可是override就不同了,它也是对基类中方法的重写,但此时只是继承类重写了一次基类的方法。可以参考下面的例子来加深理解。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->BaseClass baseclass = new BaseClass();
baseclass.Print();
InheritClass inheritClass = new InheritClass();
inheritClass.Print();
BaseClass bc = new InheritClass();
bc.Print();
最后我们再说说关键词之间的搭配关系,上面已经给出了virtual和override不兼容的几个关键词,这里就不重复了。我要说的是new和virtual在声明函数时,其实可以一块使用。因为这个函数是新的,故与其它任何new函数一样,隐藏了具有相同原型的继承来的函数。因为这个函数也是虚拟的,所以可以在派生类中进一步复位义,这样就为这个虚拟函数建立了一个新的基级别。最后用GrandsonClass类来看看。
Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->将GrandsonClass.cs修改如下:
namespace NewVirtualOverride
{
class GrandsonClass : InheritClass
{
public GrandsonClass():base()
{
}
public override void Print()
{
Console.WriteLine("GrandsonClassPrint");
}
}
}
InheritClass.cs修改如下:
namespace NewVirtualOverride
{
class InheritClass : BaseClass
{
public InheritClass():base()
{
}
new public virtual void Print()
{
Console.WriteLine("InheritClassPrint");
}
}
}
BaseClass.cs修改如下:
namespace NewVirtualOverride
{
class BaseClass
{
public BaseClass()
{
}
public virtual void Print()
{
Console.WriteLine("BaseClassPrint");
}
}
}
Program.cs修改如下:
namespace NewVirtualOverride
{
class Program
{
static void Main(string[] args)
{
BaseClass baseclass = new BaseClass();
baseclass.Print();
InheritClass inheritClass = new InheritClass();
inheritClass.Print();
BaseClass grandsonClass = new GrandsonClass();
grandsonClass.Print();\
Console.ReadLine();
}
}
}
Code
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->namespace NewVirtualOverride
{
class Program
{
static void Main(string[] args)
{
BaseClass baseclass = new BaseClass();
baseclass.Print();
InheritClass inheritClass = new InheritClass();
inheritClass.Print();
BaseClass grandsonClass1 = new InheritClass();
grandsonClass1.Print();
InheritClass grandsonClass2 = new GrandsonClass();
grandsonClass2.Print();
Console.ReadLine();
}
}
}
发表评论
-
UML
2010-08-09 11:39 1304开放分类:计算机技术计算机术语计算机科学 收藏分享到顶[6] ... -
用WebService实现调用新浪的天气预报功能
2010-07-15 21:47 2977用WebService实现调用新 ... -
Cookie简介及JSP处理Cookie的方法
2010-07-29 09:28 973Cookie简介及JSP处理Cookie的方法 一.什么是 ... -
SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法
2010-06-09 22:16 1258一直想把数据库的默认 ... -
C#Winform调用网页中的JS方法
2010-07-12 11:07 2234其实还是还是相当的简单,本文将详细的用代码来展示一下如何调用, ... -
用WebService实现调用新浪的天气预报功能
2010-07-15 21:47 1510用WebService实现调用新 ... -
SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法
2010-06-09 22:16 1089一直想把数据库的默认 ... -
基于 VS 2010 阐述C# 4个特性
2010-05-28 09:26 1083基于 VS 2010 阐述C# 4个特性基于 VS 20 ... -
Google AdSense中文官方博客今天公布了AdSense内容广告与AdSense搜索广告的收入分成比例
2010-05-25 09:12 1130google adsense 的广告分成比例总算是公布出来了。 ... -
权限管理数据表设计说明
2010-05-21 15:19 1085权限管理数据表设计说明 B/S系统中的权限比C/S中的更显的 ... -
权限管理的设计方法
2010-05-20 09:26 1430权限管理的设计方法是 ... -
多表分页存储过程
2010-05-17 14:25 1063分页存储过程 在网站设计,网页开发中,是要被经常遇到的。 ... -
vs2010跟vs2008比较增加了哪些功能
2010-05-18 09:10 2255随着vs2010的发布,新的 ... -
COM域名难逃实名监管 CN域名简化流程抢用户
2010-05-13 09:22 1192互联网实名制的落实第 ... -
网站安全之XSS漏洞攻击以及防范措施
2010-04-29 08:59 1436在网站开发中,安全问题是重中之重的问题,特别像一个sql注入, ... -
深入了解ASP.NET运行内幕
2010-04-28 09:04 1172做事情要知道根本所在 ... -
WebBrowser中显示乱码
2010-04-22 09:09 1740最近在开发cs项目的时候,因为嵌套了一个网页,要用到we ... -
vps配置笔记(10)架设svn服务
2010-04-21 09:41 1268linux 下面架设svn服务器,有点难度,我找了好多资料,现 ... -
IEnumerable
2010-04-16 09:12 1274在平常的代码编写中,虽然不常用到Ienumerable 但却不 ... -
JS代码实例:实现随机加载不同的CSS样式
2010-04-19 13:38 1420如果让网页浏览者每次打开页面都有新的感觉,可以通过替换css样 ...
相关推荐
在C#编程语言中,`new`、`override`和`virtual`是三个非常重要的关键字,它们用于控制类成员(主要是方法)的行为,涉及到多态性这一核心概念。接下来我们将详细探讨这三个关键字以及它们在实际编程中的应用。 1. `...
在C#编程语言中,`new`、`override` 和 `virtual` 是三个与继承和多态性密切相关的关键字。理解它们的区别对于编写高效的面向对象代码至关重要。 首先,`new` 关键字主要用作修饰符,有以下作用: 1. 创建对象:`...
在 C# 编程语言中,override、abstract、virtual、interface 是四个关键字,它们之间存在着紧密的联系,我们经常会遇到 override、abstract、virtual 这三个关键字的使用,而 interface 则是一种特殊的抽象类。...
C# 中的 new、abstract、virtual、override、sealed 关键字的区别和使用代码示例 摘要:本资源旨在对 C# 中的 new、abstract、virtual、override、sealed 关键字进行详细的解释和比较,并提供实践代码示例,以帮助...
在C#编程语言中,`override`、`new` 和 `base` 是三个关键字,它们在处理类继承和方法重写时起着至关重要的作用。理解这三个关键字的关系和用法对于编写可扩展和灵活的代码至关重要。 首先,我们来看 `override` ...
本文将详细探讨 C# 中 `override` 和 `new` 关键字的区别及其应用场景。 #### 基础概念 - **Override**: 当一个派生类需要修改或扩展从基类继承的方法的行为时,可以使用 `override` 关键字。这要求基类的方法必须...
在编程语言中,尤其是面向对象的语言如C#,`new`和`override`是两个非常重要的关键字,它们在处理类的继承和多态性时起到关键作用。理解这两个关键字的区别对于编写灵活、可扩展的代码至关重要。 首先,我们来看`...
在C#编程语言中,`new`和`override`关键字在继承关系中扮演着不同的角色,它们用于处理派生类与基类之间的方法和属性。理解这两者的区别至关重要,因为它们直接影响代码的行为。 首先,我们来看看`new`关键字。`new...
在C#编程语言中,`new`和`override`关键字都是用来处理方法重写和隐藏的,但它们的行为和用途有所不同。以下是对这两个关键字详细解释的个人总结。 首先,`override`关键字用于重写基类中的虚方法(virtual methods...
在C#编程语言中,Override和New关键字是用于处理继承关系中方法和属性重定义的重要概念,它们在处理多态性方面起到关键作用。这里我们将深入探讨这两种关键字的用法和区别。 首先,Override关键字用于明确表示派生...
在C#编程语言中,虚方法(Virtual)是一种关键特性,允许子类重写父类的行为。虚方法的概念在于动态绑定,即在运行时根据对象的实际类型决定调用哪个方法,而不是在编译时就已经确定。这使得面向对象编程中的多态性...
在C#编程语言中,虚方法(Virtual Methods)是一个重要的面向对象特性,它允许子类重写父类的方法实现,从而实现多态性。本文将深入探讨C#中的虚方法,包括其概念、语法、使用场景以及与非虚方法、抽象方法、接口等...
在C#编程语言中,`new` 和 `override` 关键字被用于实现多态性。多态性是面向对象编程的一个重要特性,它允许子类继承父类的方法并根据自己的需求进行修改或扩展。然而,`new` 和 `override` 在使用时有着本质的区别...
C#中new的用法有三种: (1)new是运算符,用于创建对象和调用构造函数。如Class1=new Class1();也可以为值类型调用默认的构造函数如int a=new int();此时a=0. (2)new是修饰符,用于隐藏基类成员的继承成员。override...
C#语言中的New关键字是一个多功能的关键字,它有多种用法,分别是new运算符、新修饰符和new约束。下面我们将详细介绍这三种用法。 New运算符 New运算符是C#语言中用于创建对象和调用构造函数的关键字。例如: ```...
在 C# 中,new 运算符和 new 修饰符是两个不同的概念。new 运算符用于创建对象和调用构造函数,而 new 修饰符用于隐藏基类成员的继承成员。了解这两个概念的用法和应用场景对于编写高效、灵活的 C# 代码非常重要。 ...
在C#编程语言中,`new` 和 `override` 关键字在继承关系中用于处理方法和属性的行为,它们有着显著的区别。以下是这两个关键字的详细解释及其在代码中的应用。 `new` 关键字: 1. **运算符**:`new` 作为运算符时,...
在C#编程语言中,`new`和`override`关键字都是用来处理方法重写和隐藏的,但它们之间存在着显著的区别。这篇文章将深入探讨这两种方式在实现抽象类重写时的具体差异。 首先,我们来看一下抽象类的实现。在C#中,...