0 0

一个关于C#方法重写的问题3

昨天开始看C#,看到有关方法重写的地方发现,如果类A的方法test以后有被重写的需要,
那么就要使用virtual关键字标识,如下:
public virtual void test( )
然后,类B继承类A,并重写方法test的话,需要使用override关键字标识,如下:
public override void test( )

不知道为什么C#的设计者要做出这种限制,Java中就没有这种要求。
假设某个项目用了第三方的类库(假设该类库闭源),发现类库中某个类的某个方法功能需要扩展,
难道还要通知该类的作者,让他在相应方法的前面加上virtual关键字?

感觉这完全就是一种多余的限制,只会增加语法的复杂性。

不知谁有关于这种限制的好的解释。
2009年4月22日 13:20

1个答案 按时间排序 按投票排序

0 0

采纳的答案

如果学过C++就会发现C#比Java有更多的C++遗留物 ^ ^

在C++和C#中,没有被标识为virtual的方法就不是虚方法。在调用虚方法时,运行时必须根据对象的实际类型在继承链上搜索方法的合适版本,有一定开销。如果调用的是非虚方法,则在编译时就可以确定要调用的方法的版本,运行时无需为搜索方法的版本做额外的事情。
Java中所有实例方法都是虚方法,因而调用实例方法时都需要做搜索动作。例外是如果实例方法被标记为final,则可以带来一些优化的可能。

2009年4月22日 13:34

相关推荐

    C#重写MessageBox对话框

    C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框C#重写MessageBox对话框

    C# url重写 C# url重写

    IIS URL重写模块是一个可下载的扩展,可以直接在IIS服务器上安装。在C#中,我们可以在web.config配置文件中编写重写规则。例如,以下规则将`/oldpage.aspx`重定向到`/newpage`: ```xml ^oldpage\.aspx$" /...

    c#重写的tabcontrol控件

    1. **自定义控件的外观**:在C#中,可以创建一个继承自TabControl的类,然后覆盖OnPaint方法。在这个方法里,你可以使用Graphics对象绘制自己的控件样式,例如改变选中标签的颜色、形状、边框等。同时,可以利用...

    C#重写重载与多态

    在C#中,为了能够重写一个方法,基类中的方法必须声明为`virtual`或`abstract`,而子类中相应的方法则需使用`override`关键字。例如: ```csharp public class BaseClass { public virtual void MyMethod() { ...

    asp.net c# Url重写和无扩展名Url重写

    URL重写是一种机制,它允许开发人员将一个URL映射到另一个URL,而不会改变实际请求的资源。在ASP.NET中,这通常通过使用IIS(Internet Information Services)的URL重写模块或者Microsoft的`System.Web.Routing`类库...

    C#实现按钮Button的重写

    通过以上步骤,我们成功地在C#中实现了按钮控件的重写,创建了一个具有独特外观和行为的“漂亮”按钮。这样的自定义按钮可以根据项目需求进行各种定制,提升用户体验,同时使代码更具可维护性和可扩展性。

    c#下重写BUTTON控件

    本文主要探讨了如何在C#中使用.NET框架自定义一个按钮控件(`XPButton`)。这种自定义不仅增强了控件的功能性和外观效果,还使得开发人员能够更灵活地根据项目需求调整控件的行为。下面将详细介绍`XPButton`的设计...

    c# Url重写及二级域名重写

    asp.net c# Url重写 实现二级域名 包含所有源代码 ...则顶级域名必须要支持泛域名解析 ...即要有*....这样你才可实现二级域名 为二级域名指定一个顶级域名只稍加修改即可 但此顶级域名必须要解析到网站所在的服务器

    c# 多个ListView重写控件

    首先,`A Much Easier to Use ListView - CodeProject.mht`文件可能是一个关于改进ListView的代码项目文章,通常在CodeProject网站上,开发者会分享他们的代码实现和经验。这个文件可能包含了一种或多种对ListView...

    C# Equals 和 GetHashCode 方法重写

    ### C# Equals 和 GetHashCode 方法重写 在C#编程中,`Equals` 和 `GetHashCode` 方法是非常重要的成员方法,它们对于确保对象的正确比较以及高效地存储和检索对象至关重要。这两个方法通常需要在自定义类中进行...

    C#重写SplitContainer收缩自定义控件

    C#重写SplitContainer收缩自定义控件

    ASP.NET C# URL重写 地址重写 伪静态 转HTML

    ASP.NET C# URL重写是Web开发中的一个重要概念,它涉及到网站的地址结构优化和搜索引擎友好性提升。在本文中,我们将深入探讨URL重写、地址重写、伪静态以及如何将ASP.NET C#应用程序中的动态页面转换为HTML,以提高...

    C# 重写treeView控件为组件实现全选反选

    C# 重写DEV10.0的treeView控件为组件实现全选反选和鼠标设置,组建可以引用直接用,已经开发源代码也可以根据自己需求再加功能,实现开发者快速开发,只要调用一个方法就可以。注意要安装DEV10或引用DEV控件。我把...

    Unity3d 基于xlua热更新实现系列一:熟悉lua重写C#

    XLua是Unity3D中常用的一个Lua脚本绑定框架,它允许开发者使用Lua语言来编写部分游戏逻辑,从而提高开发效率并实现热更新功能。本文将深入探讨如何基于XLua在Unity3D中实现热更新,尤其是重写C#代码的部分。 首先,...

    c#重写HashTable

    在C#编程中,`HashTable`是一个非泛型集合类,它在.NET Framework早期版本中被广泛使用。然而,随着.NET Framework的不断发展,`HashTable`逐渐被更安全、类型安全且性能更高的`Dictionary, TValue>`所取代。尽管...

    .net 重写 c# 地址 地址重写

    首先,重写(Override)是面向对象编程的一个关键特性,它允许子类重新定义或实现父类的方法。在C#中,我们使用`override`关键字来重写基类的方法,以便在派生类中提供不同的实现。例如: ```csharp public class ...

    C# 仿QQ重写窗体外观

    在本文中,我们将深入探讨如何使用C#编程语言来实现一个仿QQ的窗体外观,这是一个结合了GDI+技术的项目。GDI+(Graphics Device Interface Plus)是.NET Framework中用于图形绘制的一个强大库,它允许开发者创建复杂...

    c#自定义消息框,重写MessageBox,消息提示框

    Windows自带的消息框比较丑,特别是转到WIN7下更加,项目中用到的消息框非常多,基本上有提示信息、错误信息、询问信息这三种,从美观角度,MessageBox.show()这个方法出来的消息框有点不尽人意,于是自己写了一个,...

    C#TabControl重写(添加关闭与添加按钮)

    C#,Winform TabControl重写(添加关闭与添加按钮鼠标移动变色功能),可自定义添加按钮及样式

    C#中方法的重写

    本文为您介绍C#中方法的重写的文章,具体方法请看介绍  问题一:什么是重写?  “重写”父类方法是修改它的实现方式或者说在子类中对它进行重新编写。  问题二:为什么要重写父类的方法?  通常,子类继承...

Global site tag (gtag.js) - Google Analytics