vb.net继承的例子2007-05-24 本站 这次列举一个在窗体上画出一些图形,如:长方形、正方形等的例子。 在vb.net中,控件可以被Windows系统重新绘制,用户可以通过重载OnPaint事件来画自己的图形。PaintEventArgs是系统底层调入子例程的一个对象,用户可以通过这个对象在窗体的表面画一些图形,用户还需要建立一个Pen对象,它的颜色的缺省值是黑色,线条的宽度的缺省值是1。下面这个例子说明了这个对象的用法。 Protected Overrides Sub OnPaint(e as PaintEventArgs) Dim g as Graphics=e.graphics Dim rpen As new Pen(Color.Black) g.drawLine(rpen,10,20,70,80) End Sub 下面画一个简单的长方形,先写一个长方形的类,它可以把自己画在Windows窗体上,只有两个方法,一个是构造函数,一个是draw方法,先声明一个命名空间,然后再写下长方形的类的实现代码,如下: Namespace VBPatterns Public Class Rectangle Private x,y,h,w As Integer Protected rpen As Pen Public Sub New(Byval x_ As Integer,_ Byval y_ As Integer,_ Byval h_ AS Integer,Byval w_ As Integer) MyBase.New() x=x_ y=y_ h=h_ w=w_ rpen=New Pen(Color.Black) End Sub End Class End Namespace 现在每次在Main Form窗体中声明一个变量,就把它声明为命名空间中的一个成员。下面,首先把这个长方形的类声明为VBPatterns命名空间的一个成员: Public Class RectForm Inherits System.WinForms.Form Private rect As VBPatterns.Rectangle 并且建立一个长方形类的对象 Public Sub New() MyBase.New() "This call is required by the Win Form Designer. InitializeComponent() rect=New VBPatterns.Rectangle(40,20,30,80) End Sub 现在重载OnPaint事件: Protected Overrides Sub OnPaint(Byval e As PaintEventArgs) Dim g As Graphics g=e.Graphics rect.draw(g) End Sub 从长方形建立一个正方形:正方形不过是长方形的一个实例,可以从长方形的类派生出正方形的类而不需要重写太多的代码,下面就是实现的代码: Namespace VBPatterns Public Class Square Inherits Rectangle Public Sub New(Byval x As Integer,_ Byval y As Integer,Byval w As Integer) MyBase.New(x,y,w,w) End Sub End Class End Namespace 正方形的类实际上只包含了一个构造函数,不过它还调用了长方形的一些方法,注意到正方形类实际上没有draw方法,如果用户不声明一个新的方法,则基本类的方法就会自动被运用。 下面是通过构造函数建立了一个长方形和一个正方形 Public Sub New() InitializeComponent rect=New Rectangle(10,10,30,80) sq=New Square(50,50,50) End Sub 并重载Onpaint方法: Protected Overrides Sub OnPaint(Byval e As PaintEventArgs) Dim g As Graphics g=e.Graphics rect=draw(g) sq.draw(g) End Sub 在vb 6.0中,用户可以把一个变量或者类声明为公有或者是私有,在类中公有变量可以被其他的类访问,而私有变量只能在类中被访问。在vb.net中引入了关键字Protected,Protected能在类中和它派生出来的类访问,也就是说Protected变量不能在类的外面被公有的访问。 假设现在需要派生一个新的类叫做DoubleRect,它是从类Rectangle派生出来的,它的功能是画两个稍微错开的长方形,而且颜色不一样。在构造函数中,将用红色来处理长方形的颜色,代码如下: Namespace VBPatterns Public Class DoubleRect Inherits Rectangle Private redPen As Pen "---- Public Sub New(Byval x As Integer,_ Byval y As Integer,_ Byval w As Integer,Byval h As Integer) MyBase.New(x,y,w,h) redPen=NewPen(Color.FromArGB(255,Color.Red),2) End Sub 这意味着新类DoubleRect将具有自己的draw方法,现在基本的类已经有一个draw方法了,所以必须再建立一个具有相同名字的新方法,所以重载这种方法,代码如下: Public Overrides Sub draw(Byval g As Graphics) MyBase.draw(g) g.drawRectangle(redPen,x+4,y+4,w,h) End Sub 注意:这里想使用坐标系,而且长方形的大小已经在构造函数进被给定了,但有时用户需要改变这些参数,那么可以在DoubleRect中保留这些参数的备份,自己再声明一些参数,或者在基本类Rectangle中把这些参数设为Protected型,如: Protected x,y,h,w As Integer 还必须告诉编译器,通过声明Rectangle的draw方法为overridable,这样就可以给draw方法重载了,代码如下: Public Overridable Sub draw(Byval g As Graphics) g.DrawRectangle(rpen,x,y,w,h) End Sub