关于VB.NET中的重载和重写

trytoremember 2005-04-13 09:48:28
是否在基类中重载过的方法,就不能再在子类中重写,而必须要使用shadows来隐藏
同样的,在基类是一个单一的方法,而在子类中试图重载若干个新版本,也不能使用重写而要用shadows隐藏?

比如:

class a
public overridable sub f()

end sub

public overridable sub f(byval i as integer)

end sub
end class

class b
inherits a
public shadows sub f(byval i as integer,byval j as integer)

end sub
end class
...全文
450 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qunluo 2005-04-16
  • 打赏
  • 举报
回复
弄不明白,明天在看!
trytoremember 2005-04-15
  • 打赏
  • 举报
回复
我发现好像只要基类中存在多个方法重载后,就无法重写了
可以试一下这段代码

Class a
Public Overridable Sub f()

End Sub

Public Overridable Sub f(ByVal i As Integer)

End Sub
End Class

Class b
Inherits a
Public Overrides Sub f(ByVal i As Integer, ByVal j As Integer)

End Sub
End Class

VB报错:
sub“f”不能声明为“Overrides”,因为它不重写基 class 中的 sub。
sub“f”隐藏在基 class“a”中声明的可重载的成员。如果要重载基方法,则此方法必须声明为“Overloads”。

yohomonkey 2005-04-15
  • 打赏
  • 举报
回复
“请注意,组中唯一的虚拟方法应该是具有大多数参数的方法,并且只应在需要可扩展性时才应有虚拟方法。
如果必须提供重写方法的能力,请仅使最完整的重载是虚拟的并根据它来定义其他操作。”
上面是MSDN里面的原话。感觉这个跟楼主要求的正好向背离了。楼主是在子类里面定义,原文是建议在基类里面定义“具有大多数参数的方法”。
yohomonkey 2005-04-15
  • 打赏
  • 举报
回复
但是感觉这种作法应该是有些问题的,感觉在继承类里面从载基类中应该包含的最完整的函数或方法有些不妥。
hamadou 2005-04-15
  • 打赏
  • 举报
回复
晕,你要重写的话,基类得有这个过程啊。就象你的
Public Overrides Sub f(ByVal i As Integer, ByVal j As Integer)
End Sub
在class a 中根本都没有同名同参数个数同参数类型的过程啊!你怎么重写?先弄明白重写是什么意思,好好看看上面的帖子。重写首先要保证该过程在基类中存在,并且允许重写(overridable)。所以,你的想要有两个参数的过程f不能重写,只能重载。除非你在基类中加入一个包含同样参数个数与类型而且同名并允许重写的过程!
yohomonkey 2005-04-15
  • 打赏
  • 举报
回复
Public Class Class2
Inherits Class1

Public Overloads Sub f()

End Sub

Public Overloads Sub f(ByVal i As Integer)

End Sub

Public Overridable Overloads Sub f(ByVal i As Integer, ByVal j As Integer)

End Sub

End Class
trytoremember 2005-04-15
  • 打赏
  • 举报
回复
to yohomonkey(思考中的猴)

你的这段代码VB还是报错的
实际上我分别试过
Public Overrides Sub f(ByVal i As Integer, ByVal j As Integer)
Public Overrides Sub f(ByVal i As Integer)
Public Overrides Sub f()
三种方式的重写,均告失败
所以我得出结论,基类中重载过的方法,在子类中是不能重写只能隐藏的.
yohomonkey 2005-04-15
  • 打赏
  • 举报
回复
Class b
Inherits a
Public Overridable Sub f(ByVal i As Integer, ByVal j As Integer)

End Sub
workup 2005-04-15
  • 打赏
  • 举报
回复
overrides 是重写.基类中没有符合你要重写方法的签名.
hamadou 2005-04-14
  • 打赏
  • 举报
回复
1.当基类的方法有多个版本的重载后,依然可以在子类中对其重写。只要基类中的属性(或方法)的定义中包含overridable关键字。
2.如果想屏蔽掉基类中的同名方法而只留下子类中的方法,只能通过使用shadows关键字隐藏
基类的方法。这个是对的,但不意味着不能在子类中重载基类中的方法。
trytoremember 2005-04-13
  • 打赏
  • 举报
回复
to wuyazhe(我的宝贝叫阿刺)
你说的没错。但是,当基类的方法有多个版本的重载后,就无法再在子类中对其重写了。
如果想屏蔽掉基类中的同名方法而只留下子类中的方法,只能通过使用shadows关键字隐藏
基类的方法。
至少目前我发现VB编译器是这样处理的,我想在CSDN上向各位高手再确认一下。
hahahyOo 2005-04-13
  • 打赏
  • 举报
回复
理解!
兔子-顾问 2005-04-13
  • 打赏
  • 举报
回复
重载就是你写的函数和之前存在的同名不通参数的函数同时可用,并存
重写就是只有你新写的有效,父类的无法再使用了。
本DataGridView打印控件和.NET打印控件5.7版2014年11月2日修改完成,完全免费,在.NET2.0及以上环境下都可以使用(VB打印、C#打印都是可以的),有帮助文档与使用实例。 与上一版相比,控件5.7版的主要更改如下: 1、重写DataGridView导出Excel的代码,5.7版控件使用开源的NPOI库导出Excel,完全不依赖Office,不会再有因为没装Office或Office安装有问题而导出失败的情况,而且导出速度非常快,支持大于65536条记录的导出(自动分成多个工作表),效果非常好。导出Excel的接口未变,因此您不需要修改任何代码,只需替换控件即可; 2、SimpleReport打印组件添加了导出Excel功能,该功能在打印预览界面的按钮; 3、多表头组件MulHeaderDataGridView添加了从Excel导入数据(ImportFromExcel函数)及复制(Copy函数)与粘贴(Paste函数)的功能。其导入Excel功能使用开源的NPOI组件实现,不依赖Office。 4、其他一些完善,比如解决了导出Excel时强制换行不自动显示,而是要双击才显示问题;导出Excel时,图片能按单元格大小导出。 本控件特色: 1、强大的DataGridView打印功能,不仅可以以多种形式(普通打印、分栏打印、跨页打印、工资条打印)打印DGV表格,基本上能完全按DGV控件本身设置的格式如字体、字号、背景颜色、前景颜色、单元格对齐方式等打印出来,文字图像都可以打印,而且是完全根据表格当前的显示顺序进行打印的,基本上做到了所见即所得的打印。 2、报表设计功能。报表模板设计组件EasyReport可以设计普通报表、分组报表、套打模板等,以DataGridView为数据源。控件的位置以毫米为计量单位,定位准确,很适合套打单据设计。 3、强大的图表打印功能。5.2版控件新增了一个Chartlet的组件,使用非常方便,可以生成柱形图、饼图、折线图等多种图形,而且可以设置2D或3D效果,既可以在打印控件打印出来,也可以在Graphics对象显示。 4、分组汇总打印DataGridVeiw功能,每组还可以自动换新页打印,还可以自动增加行号。 5、强大的文本打印输出功能,控件提供多个文本打印重载函数,打印文本时,如果需要,控件会自动换行和换页打印输出。还增加了以指定行间距及字符间距打印文本的功能,可以用固定行距,也可以用单倍或多倍行距打印文本。 6、强大的绘图功能,基本上.NET的GDI+的绘图函数(如直线、矩形、路径、多边形、曲线等)都有,只有个别函数的名称有点区别。 7、支持同一文档多种版面格式打印(类似于Word的节的功能):对同一份文档,不同的页面可以设置不同的格式(纸张大小、纸张方向、页边距),只需要在新增一页时在NewPage方法指定要使用的页面格式即可,使用非常简单。 8、报表文件保存功能。本控件允许将当前打印预览的内容保存为报表文件,以后使用本控件重新打开该报表文件即可重现原来保存报表时的打印内容。 9、Excel导出功能,可以将DataGridView导出为Excel文件,5.7版控件使用开源的NPOI导出Excel,速度非常快,效果非常好,5.4版还增加了合并单元格的导出功能。 10、打印DataGridView时的打印方案保存与读取功能。可以将当前打印参数保存为打印方案文件,或者从保存的打印方案文件读取打印参数。 11、水印打印功能。根据需要,可以在页面打印或不打印以半透明空心文字打印水印。 12、强大的容器控件打印功能(DrawPanel函数)。借助该函数,您只需要在您的容器控件设计好要打印的内容及打印内容的相对位置,控件轻松帮你打印出来(如果超过一页,控件会自动换页续打)。 13、特殊文字效果打印功能。控件具有打印浮雕文字、阴影文字、空心文字、块文字的功能。 14、页眉页脚既可打印文字,也可打印图像,或者即打印图像又打印输出文字。 15、图像与图标打印输出功能。 16、多表头(跨行跨列的复杂表头)打印功能,多表头组件支持多表头显示与打印、单元格内容的合并显示、打印与导出。 17、自定义纸张支持功能。 18、纸张背景图片设置打印功能。 19、.NET4.0支持功能(是单独的一个文件)。 20、直接打印窗口的TreeView控件功能。 21、打印窗口的ListView功能。 22、RichTextBox控件的RTF文本打印功能。 23、斜线表头打印功能(5.4版新增)。 24、二维码打印功能(5.5版本增加)。 25、5.6版新增的SimpleReport组件允许您在一个方案文件管理多个打印方案,在打印预览时能自由在各个打印方案之间切换。 26、5.7版控件增加了使用开源的NPOI从Excel文件导入数据到DataGridView的功能,以及DataGridView的复制与粘贴功能。 我将持续改进该控件,并将不断推出控件的新版本,要查看或下载控件的升级版本,请登陆网站:http://myyouping.download.csdn.net/ 。具体使用方法请参见帮助文件与实例文件,如有疑问或好的建议,请与我联系: 邮箱:myyouping@139.com Q Q:479781502
net的最近面试经典试题ASP.NET面试题集合 1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。 答:public class MainClass { public static void Main() { Console.WriteLine(Foo(30)); } public static int Foo(int i) { if (i 0 && i <= 2) return 1; else return Foo(i -1) + Foo(i - 2); } } 4.C#的委托是什么?事件是不是一种委托? 答 : 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的引用。 是,是一种特殊的委托 5.override与重载的区别 答 : override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类函数的重写。为了适应需要。 6.如果在一个B/S结构的系统需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? 答: foreach (System.Windows.Forms.Control control in this.Controls) { if (control is System.Windows.Forms.TextBox) { System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; tb.Text = String.Empty ; } } 8.请编程实现一个冒泡排序算法? 答: int [] array = new int ; int temp = 0 ; for (int i = 0 ; i < array.Length - 1 ; i++) { for (int j = i + 1 ; j < array.Length ; j++) { if (array[j] < array) { temp = array ; array = array[j] ; array[j] = temp ; } } } 9.描述一下C#索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。 10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i < Num + 1 ; i++) { if((i%2) == 1) { Sum += i ; } else { Sum = Sum - I ; } } System.Console.WriteLine(Sum.ToString()); System.Console.ReadLine() ; 11.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答:一般为3层 数据访问层,业务层,表示层。 数据访问层对数据库进行增删查改。 业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。 表示层为了与用户交互例如用户添加表单。 优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 缺点: 增加成本。 12.在下面的例子里 using Sy

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧