gpt4 book ai didi

VB.Net 继承覆盖

转载 作者:行者123 更新时间:2023-12-03 04:47:43 25 4
gpt4 key购买 nike

我是 VB.Net 新手(我有 Foxpro 背景),过去两周一直在埋头读书,试图开始了解一些基础知识。

我正在努力掌握类继承,并希望这不是一个太大的挑战性问题。

我创建了一个类并将其编译为 DLL。它只是允许我在表单上放置一个按钮。我只想捕获 Click 事件 - 我已经成功做到了这一点,但想覆盖继承的代码,而不是同时触发目前似乎正在发生的事件。

我意识到我可以双击该控件并直接在 MyButton1 单击事件中输入代码,但希望以编程方式捕获此事件,而不是通过处理程序。

我认为这只是使用可覆盖/覆盖选项的情况。

这是我的类(class)中的代码:

Imports System.Windows.Forms
Imports System.Drawing

Public Class MyButton

Inherits Windows.Forms.Button

Sub New()

End Sub

Protected Overridable Sub MyButton_Click(sender As Object, e As System.EventArgs) Handles Me.Click

MsgBox("Base Click")

End Sub

End Class

然后我将按钮放在表单上并将其命名为 MyButton1 并放在加载事件中:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

AddHandler MyButton1.Click, AddressOf Button_Click

End Sub

Private Sub Button_Click()
MsgBox("Actual Click")
End Sub

问题是,两个事件都会触发,我想要覆盖/关闭基本事件的选项。

我想我可以将“overrides”关键字添加到 Button_Click 例程中,即:

Private Sub Overrides Button_Click()

但我收到一条错误消息Sub Button_Click() 无法声明为“覆盖”,因为它不会覆盖基类中的子

所以澄清一下 - 目前我的代码触发了这两个事件,所以我收到两条消息。我希望能够关闭/抑制基类事件。

任何帮助将不胜感激。

最佳答案

I thought this would just be a case of using the overridable / overrides options.

这里的根本问题是你试图将方钉插入圆孔。

要覆盖某些内容,您需要涉及继承。派生类重写从基类继承的内容。例如,如果您从 MyButton 类继承来创建名为 MyButtonDerived 的新类型的 Button,那么您可以按预期执行此操作:

Public Class MyButton
Inherits Windows.Forms.Button

Protected Overridable Sub MyButton_Click(sender As Object, e As System.EventArgs) Handles Me.Click
MsgBox("Base Click")
End Sub

End Class

Public Class MyButtonDerived
Inherits MyButton

Protected Overrides Sub MyButton_Click(sender As Object, e As EventArgs)
' We don't call the base method...
' MyBase.MyButton_Click(sender, e)

' ... and instead do something else:
MsgBox("Derived Click")
End Sub

End Class

相反,当您按照原始问题描述将 MyButton 放置到表单上时,不会发生继承。相反,您设置的是“对象组合”;表单包含按钮的实例(不是从中派生的)。虽然可以更改从表单本身单击按钮时发生的情况,但这不是可以通过 OOP、继承和覆盖来解决的情况。

如果 MyButton 的设计没有允许最终用户抑制其基本功能,那么您的使用方式就会受到限制。下面是一个示例,说明如果 MyButton 被设计为允许最终用户抑制其基本点击功能,它可能会是什么样子:

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
MyButton1.SuppressDefaultClick = True
End Sub

Private Sub MyButton1_Click(sender As Object, e As EventArgs) Handles MyButton1.Click
MsgBox("Form Click Code")
End Sub

End Class

Public Class MyButton
Inherits Windows.Forms.Button

Private _suppress As Boolean = False
Public Property SuppressDefaultClick As Boolean
Get
Return _suppress
End Get
Set(value As Boolean)
_suppress = value
End Set
End Property

Protected Overridable Sub MyButton_Click(sender As Object, e As System.EventArgs) Handles Me.Click
If Not SuppressDefaultClick Then
MsgBox("Base Click")
End If
End Sub

End Class

如果 MyButton 没有像上面那样包含抑制其内置点击处理程序的方法,那么您必须采用其他方法来解决您的问题。在这种情况下,您必须阻止该按钮收到鼠标左键已被单击的消息,而是实现您自己的例程。这种方法被认为是一种黑客行为,因为您正在解决某些事物的局限性,而不是按照最初的预期方式使用它。这是实现黑客攻击的一种方法:

Public Class Form1

Private WithEvents TMBC As TrapMyButtonClick

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TMBC = New TrapMyButtonClick(Me.MyButton1)
End Sub

Private Sub TMBC_Click(sender As MyButton) Handles TMBC.Click
MsgBox("Form Click Code")
End Sub

Private Class TrapMyButtonClick
Inherits NativeWindow

Private _mb As MyButton

Private Const WM_LBUTTONDOWN As Integer = &H201

Public Event Click(ByVal sender As MyButton)

Public Sub New(ByVal mb As MyButton)
If Not IsNothing(mb) AndAlso mb.IsHandleCreated Then
_mb = mb
Me.AssignHandle(mb.Handle)
End If
End Sub

Protected Overrides Sub WndProc(ByRef m As Message)
Select Case m.Msg
Case WM_LBUTTONDOWN
RaiseEvent Click(Me._mb) ' raise our custom even that the form has subscribed to
Exit Sub ' Suppress default behavior

End Select
MyBase.WndProc(m)
End Sub

End Class

End Class

Public Class MyButton
Inherits Windows.Forms.Button

Protected Overridable Sub MyButton_Click(sender As Object, e As System.EventArgs) Handles Me.Click
MsgBox("Base Click")
End Sub

End Class

关于VB.Net 继承覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27677022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com