.NET 中可视化继承的力量——“最佳”






3.58/5 (25投票s)
2003 年 12 月 5 日
9分钟阅读

82087

630
本文旨在探索可视化继承的强大功能,让您的应用程序开发变得非常轻松。
目录
- 为什么需要可视化继承
- 引言
- 继承概念
- 可视化继承
- 如何继承窗体
- 如何创建自定义属性
- 如何从子窗体使用自定义属性
- 如何更改父窗体中不存在的控件的属性(即,它们在子窗体中)
- 如何从子窗体覆盖父窗体的功能
- 如何在设计时更改继承控件的属性(即,如何重新定位控件、设置不同属性等)
为什么需要可视化继承?
因此,在阅读本文之前最大的问题是——为什么需要可视化继承。当我们需要为应用程序提供一些基本功能时,我们就需要可视化继承。
首先,我们将所有基础/通用代码编写到基础窗体中(我们希望继承的任何Form
)。然后,为了使用基础窗体的一些功能,我们可以使用窗体继承,而不是复制或编写一些全局函数来更改属性/调用方法/等等(就像我们以前在早期语言中所做的那样)。
我们可以将基础窗体继承到我们想要实现通用功能的窗体中。当我们继承窗体时,基础窗体的所有public
/protected
功能都会合并到子窗体中。
例如:在常见场景中,我们必须在应用程序中设计导航面板以在记录之间导航。以前,为了避免重复代码,我们使用 ActiveX 控件。首先,我们为导航设计 ActiveX 控件,然后将其放置在我们想要实现功能的窗体上。
但这次,我们可以在基础窗体中编写导航面板的功能,然后继承这个窗体,在子窗体中实现类似的功能,并充分利用窗体继承。
大多数时候,当我们需要在项目中提供导航面板、状态栏、信息标签等功能时,我们可以使用窗体继承。将所有这些代码编写在基础窗体中,然后将基础窗体继承到您想要实现相同功能的窗体中。如果您愿意,您还可以从子窗体中覆盖基础窗体的部分/所有功能,而不会影响基础窗体。
从现在开始,可视化继承和窗体继承可以互换使用。现在,您已经知道为什么应该阅读本文了。所以,各位可以尽情阅读。
引言
当微软宣布推出他们的新 VB.NET,成为我们最喜欢的编程语言 Visual Basic 的最佳继承者时,VB 程序员发生了重大变化。
VB 缺乏继承的强大功能,因此微软决定在 VB.NET 中实现继承。每次我们需要在应用程序中创建一个新窗体时,我们都会创建一个System.Windows.Forms.Form
类的新实例,并根据我们的需求更改其属性。放置一些控件,我们的窗体就可以使用了。正如我们所知,通过在新窗体上放置一些控件,我们将Form
类扩展为NewForm1
,这意味着我们创建了一个名为NewForm1
的新类。我们的新窗体是一个类,由于 .NET 支持继承,我们可以扩展任何类。
因此,我们可以得出结论,我们可以设计基础窗体并在所有窗体中使用基础窗体设计。
就像我们有
基础窗体
Public Class PMainForm
Inherits System.Windows.Forms.Form
子窗体
Public Class ChildForm
Inherits PmainForm
现在,我们可以按照我们希望的方式使用子窗体。我们可以对子窗体做的事情:在子窗体本身内覆盖基础窗体的功能(即,在子窗体中的函数中使用Shadows
关键字——我们稍后将在本文中详细介绍)。我们可以向基础窗体添加自定义属性,并在子窗体中设置它们(用于控制最初不存在于父窗体中的控件)。
继承概念
我知道,面向对象程序员一定了解继承的方方面面。本节专门针对非面向对象程序员,因此有经验的面向对象程序员可以跳过本节。
定义(继承):继承是一种允许类 A 继承类 B 属性的机制。我们说“A 继承自 B”。因此,类 A 的对象可以访问类 B 的属性和方法,而无需重新定义它们。以下定义了两个术语,通过这两个术语我们可以指代使用继承时参与的类。
定义(超类/子类):如果类 A 继承自类 B,则 B 称为 A 的超类。A 称为 B 的子类。子类的对象可以在预期相应超类对象的地方使用。这是因为子类的对象与超类的对象共享相同的行为。
超类被称为父类。子类可以被称为子类或仅仅是派生类。当然,您可以再次从子类继承,使该类成为新子类的超类。这导致了超类/子类关系的层次结构。如果您绘制此层次结构,您将得到一个继承图。
一种常见的绘图方案是使用带箭头的线条来指示两个类或对象之间的继承关系。
可视化继承
我们知道如何创建类的对象。以类似的方式,我们也可以继承一个Form
,我发誓我不是在开玩笑。
是否可以继承父窗体的组件?
是的,这是可能的。但是继承控件并不意味着我们能够在子窗体中查看控件,因为我们继承了控件,但没有继承我们在父窗体中设置的那些控件的属性。这意味着,假设我们在父窗体中放置了一个Button
。它的Top
位置在 200px。这并不表示如果我们将父窗体继承给子类,那么我们将能够在相同位置看到相同的按钮(即Button1.Top = 200
)。
那么,这一切是如何发生的呢?我们如何能够在子窗体中以相同位置看到父窗体的控件?
VS.NET 通过重新定位子窗体中的控件来实现这一点。您可以体验一下。去更改父Form
中的位置,并且不要构建父窗体。现在打开子Form
,看看Button
位置的变化,它仍然在旧位置。
这意味着,即使我们在父窗体中更改了按钮的位置,它也没有改变。所以 VS.NET 所做的是,当我们编译父窗体时,它会重置子窗体中控件的属性。
现在,大家都知道 VS.NET 是如何实现可视化继承的。
本文有什么新内容?
如果您只是简单地继承窗体,您将无法更改您放置在基窗体中的控件的属性。本示例涵盖
- 如何继承窗体?
- 如何创建自定义属性?
- 如何从子窗体使用自定义属性?
- 如何更改父窗体中不存在的控件的属性(即,它们在子窗体中)?
- 如何从子窗体覆盖父窗体的功能?
- 如何在设计时更改继承控件的属性?(即,如何重新定位控件、设置不同属性等)
1) 如何继承窗体?
打开子窗体,将子窗体的Inherits
行替换为<父窗体名称>。
<System.Windows.Forms.Form>
基础窗体
Public Class PMainForm
Inherits System.Windows.Forms.Form
子窗体
Public Class ChildForm
Inherits PmainForm
2) 如何创建自定义属性?
打开父窗体并创建一个属性(作用域为Protected Friend
)。
'CurrentPosition Property
Dim LPosition As Long
Protected Property Position() As Long
Get
Return LPosition
End Get
Set(ByVal Value As Long)
LPosition = Value
End Set
End Property
3) 如何从子窗体使用自定义属性?
打开子窗体。使用Me.<属性名>
来更改属性。例如:我们正在子窗体的Load
事件中更改属性。
Private Sub CForm3_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.Position = 99
End Sub
4) 如何更改父窗体中不存在的控件的属性(即,它们在子窗体中)?
打开父窗体,定义一个接受Control
作为返回类型的属性。
'InfoLabel Property (Control which we want to use from the child form)
Dim localLabel As LabelProtected Property InfoLabel() As Label
Get
Return localLabel
End Get
Set(ByVal Value As Label)
localLabel = Value
End Set
End Property
现在,打开子窗体。放置您想要与父窗体一起使用的控件。在子窗体的任何事件中,从子窗体更改父窗体的ControlProperty
。对于本示例,我已在子窗体的Load
事件中完成此操作。
Private Sub CForm3_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'Control to be controlled by the Parent Form
Me.InfoLabel = Label1
Me.Position = 99
End Sub
5) 如何从子窗体覆盖父窗体的功能?
覆盖父窗体中处理特定功能的函数(例如,父窗体中Button
的click
事件)。
如果您从父窗体复制并粘贴该函数,请不要忘记添加Shadows
属性,以禁止父窗体的函数。(注意:当我们使用Shadows
关键字时,该函数在父窗体中不需要使用Overridable
关键字。)
父窗体
'How to share the implementation of the Parent Form
Protected Friend Overridable Sub BParent_Click(ByVal _
sender As System.Object, ByVal e As System.EventArgs)_
Handles BParent.Click
MsgBox("Functionality of Parent is used.")
End Sub
子窗体
'Overiding the implementation of the Parent Form
'please don't forget to remove the handles keyword from the last while
'implementing in the child form
Protected Friend Overrides Sub BParent_Click(ByVal _
sender As System.Object, ByVal e As System.EventArgs)
MsgBox("Functionality of Child is used.")
End Sub
或者
Protected Friend Shadows Sub BParent_Click(ByVal _
sender As System.Object, ByVal e As System.EventArgs)
MsgBox("Functionality of Child is used.")
End Sub
6) 如何在设计时更改继承控件的属性?(即,如何重新定位控件、设置不同属性等)
主要问题是,当我们继承任何父窗体时——这非常简单。将我们想要从子窗体控制的控件的Modifiers
属性从Friend
更改为Protected Friend
。注意:Protected Friend 不会在列表中显示,所以请费点劲执行以下步骤:
- 打开父窗体的代码窗口。
- 展开“Windows 窗体设计器生成的代码”部分。
- 找到
InitializeComponent()
函数。<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
- 在该函数上方,您将找到我们放置在窗体中的控件的初始化代码。它们将如下所示:
'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Friend WithEvents Button1 As System.Windows.Forms.Button Friend WithEvents PBNavPrev As System.Windows.Forms.Button Friend WithEvents NavCaption As System.Windows.Forms.Label Friend WithEvents BParent As System.Windows.Forms.Button Friend WithEvents NavPanel As System.Windows.Forms.Panel <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
将控件的访问修饰符更改为
Protected Friend
,以便在子窗体中共享它们。 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Protected Friend WithEvents Button1 As System.Windows.Forms.Button Protected Friend WithEvents PBNavPrev As System.Windows.Forms.Button Protected Friend WithEvents NavCaption As System.Windows.Forms.Label Protected Friend WithEvents BParent As System.Windows.Forms.Button Protected Friend WithEvents NavPanel As System.Windows.Forms.Panel <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
为了全面理解这个概念,您可以下载随附的应用程序。这将为您提供对窗体继承更好的理解。
好的,各位,就是这样了。希望本文能让大家更好地理解窗体继承的内部工作原理。以及如何利用 VS.NET 的可视化窗体继承功能。
请不要忘记给这篇文章评分,这样我才能继续写作,提升自己,并为您呈现“最佳”内容。如有任何疑问,请随时通过saurabhdotnet@hotmail.com联系我。我将不胜感激。
那么,现在去享受这些吧。我很快就会带着ADO.NET的“最佳”代码示例回来,在此之前请保重。再见。