扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Inherits
成都创新互联是一家专注于成都网站制作、成都做网站、外贸营销网站建设与策划设计,普陀网站建设哪家好?成都创新互联做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:普陀等地区。普陀做网站价格咨询:18980820575
Public Class test
Inherits System.Collections.ArrayList
End Class
我们都知道,面向对象语言的三大特征是:封装、继承和多态。而重写和重载是多态的两种表现形式。多态,顾名思义,就是指多种形态。而重写和重载正好体现了这一点。现在我们以 VB.NET 语言来说明两者的区别。
重写是发生在父类与子类之间的关系。具体来讲就是子类可以重写父类的现有的方法。它要求子类的方法名称及参数必须与父类完全一致。比如吃饭,父亲可以吃两碗面,孩子同样也是吃面,却只能吃一碗。
重载则主要是发生在同一个类当中的,它通过多个名称相同的方法,但方法参数不相同,或者方法返回类型不相同来加以区别。其中,方法参数不相同包括以下几种情况:参数的个数不相同,参数的类型不相同,参数的对应位置不相同。需要说明的是,重载同样可以应用到父类与子类当中。即子类重载了父类的方法。
重写:
在 VB.NET 中,重写汲及到的关键字有:
OverRidable: 在父类中声明的可以在子类中重写的方法。
OverRides: 在子类中声明的要重写父亲中可重写的方法。
MustOverRide: 在父类中,表示这个方法必须在子类中重写。此时,该类必须声明为抽象类。
NotOverridable: 如果当前类还有子类,那么,在其子类中,该方法不允许被重写。
重载:
在 VB.NET 中,重载用到的关键是 OverLoads。
这里需要说明几点:
1. 对于在同一类当中,一组名称相同的方法或函数重载时,可以加关键字 OverLoads 或者不加。但如果其中有一个方法加上,那同组其它方法也必须加该关键字。
2. 如果该方法是重载父类中的方法。那么必须加 OverLoads 关键字。
3. 如果两个同名函数仅返回类型不相同,则它们不能重载,即必须在参数上有所不同。
VB.net
Public Class 父类
End Class
Public Class 子类
Inherits 父类
End Class
总体来说,操作上区别不大,
都是在一个空白的窗体上面画控件,
基本控件总体变化不大,
而且预设的控件量很多,
基本上不用再倒入其他什么玩艺儿了……
(.NET 里是没有 ActiveX 控件这么一说的,大家平起平坐)
可是代码的变化很大,关键字啊变化都挺大的……
比如,在控件方面,控件的文本属性都是 Text,而没有 Caption 这么一说
不过 Value 属性依然保留。
Form 的 Show 方法被拆成了 Show 和 ShowDialog,顾名思义。
Unload 方法被 Form 的 Close 方法代替。
在对控件的事件处理方面,VB 6.0 使用方法的名称来定义事件处理程序,
而在 .NET 中使用 Handles 语句来定义,
并且可以用 AddHandler 来在运行时定义事件处理程序。
在关键字方面,
VB.NET 使用 Class、Module 关键字来标记一个模块,
就像 Sub、Function 一样,
而不是以文件区分,
即一个文件里能放多个模块。
而且 VB.NET 能够提供完备的 OOP 支持,
较 VB6.0 相比,
可以使用 Inherit 关键字来实现类的继承,
因此“基类”、“派生”、“重写”不再是 C 的专利。
于是又出现了 MyBase 关键字用于表示当前实例(Me)的基类,
在 .NET 里,和“我”有关的关键字包括:Me、My、MyBase、MyClass。
随之而来的是与可继承性有关的 Overridable、MustInherit、MustOverride、NotInheritable、NotOverridable、Protected,
与继承相关的 Inherit、Override 关键字。
另外,VB.NET 支持成员重载,即使用相同的名称与不同的参数来区分不同的成员。
而且,在 .NET 框架中,
有一个用来将不同的模块分开的容器,命名空间(Namespace 关键字),使模块井井有条,减少了命名冲突的发生。
比如内置的各种控件都定义在System.Windows.Forms 命名空间里。
在数据类型方面,
在 .NET 框架中,所有的类型(包括继承自 ValueType 的 String、Integer、作为各种枚举的基类的Enum类型等)都继承自 Object 类型,即 Object 取代了 Variant。
而 Object 有一个很方便的 ToString 函数,在 CStr 不管用的时候可以用这个。
而且,在 .NET 中,考虑到程序的性能,
不建议使用后期绑定,例如:
(VB 6.0)
Dim V1 As String, V2 As String
V2 = V1 * 50
在 .NET 中,
如果文件头部有 Option Strict [On],
或是(建议)在工程设置里打开这一选项,
第二行就会报错,
因为*不是适用于 String 的操作符,
而在 VB 6.0里会自动执行转换,
如果是在 VB.NET,建议执行强制转换:
(VB.NET)
Dim V1 As String, V2 As String
V2 = CStr(CInt(V1) * 50)
同理,
(VB 6.0)
Dim Obj As Object
Set Obj = TextBox1
Obj.Text = “Hello World!”
第三行就会报错,
因为 Caption 不是 Object 的属性,
而是 TextBox 的属性,
解决方案是,使用早期绑定:
(VB.NET)
TextBox1.Text = “Hello World!”
如果需要,可以使用:
DirectCast(Obj, TextBox).Text = “Hello World!”
与此相关的新式转换关键字包括 CType、DirectCast、TryCast、CObj
尽管看起来累赘些,
但可以避免过度的随意性。
由此,许多在 VB 6.0里不是很明朗的东西变得豁然开朗,
比如我们设计的窗体其实继承自 Form 类,
而 Form 类又继承自 Object,因此我们可以使用:
(VB 6.0)
Dim FormInstance As Form
Set FormInstance = New Form1
而不会报错。
说到这里,.
NET 不支持默认属性,
即:
(VB 6.0)
Command1 = “Hello World!”
等价于:
Command1.Caption = “Hello World!”
而在 .NET 中没有 Set 关键词:
(VB.NET)
Dim Ctl As Control
Ctl = Command1
只能先说到这里了……
有点多,
总之是 .NET 很强大,
过渡不是没有可能,
但要多看 MSDN。
在继承类中添加了空的事件过程,估计也会调用基类事件过程的,也就是两个事件过程都会被调用。可以试试在继承类构造函数中用 RemoveHandler 语句能不能撤销基类的事件过程的绑定。
另外一般的过程可以用override关键字隐藏基类的同名方法,比如基类调用的方法被继承类override重写后,就会调用继承类的方法了。所以可以把事件处理代码放在一普通过程中,由事件过程调用,这样继承类可以用空的同名方法覆盖基类方法了。
在VB.NET的类里,实现一个接口的语句是:
implements接口名称
例如,下面定义一个车(总称)的接口,这里的车是各种车的总称:
Public Interface ICar
Property color() As String
Property speed() As Long
Sub PrintInfo()
End Interface
然后在不同类型的“车”类里实现它:
Public Class A_Car
Implements ICar
Dim m_color As String, m_speed As Long
Public Property color() As String Implements ICar.color
Get
Return m_color
End Get
Set(ByVal Value As String)
m_color = Value
End Set
End Property
Protected Overrides Sub Finalize()
MsgBox(I was deconstructed!)
End Sub
Public Sub New()
m_color = Red
m_speed = 210
MsgBox(I was constructed!)
End Sub
Public Property speed() As Long Implements ICar.speed
Get
Return m_speed
End Get
Set(ByVal Value As Long)
m_speed = speed
End Set
End Property
Public Sub PrintInfo() Implements ICar.PrintInfo
MsgBox(Color: m_color vbNewLine Speed: m_speed, MsgBoxStyle.Information)
End Sub
End Class
在 Form 的 Load 事件中编写:
Dim myCar As New A_Car
myCar.PrintInfo()
运行之后就创建了一个 A_Car 类的实例 myCar,然后出现两个对话框,分别说明实例已经创建和汽车的信息。当窗体卸载时,这个类的实例 myCar 将自动销毁,这时将出现一个“I was deconstructed!”的对话框。
声明一个接口时,需要考虑以下几点:
1.接口主体只限于对方法,索引器以及属性的声明;
2.接口成员是隐式公开的,如果对其显式指定访问级别,就会出现编译器错误;
3.接口中不能包含字段,构造函数和常量等;
4.在接口中不能实现任何方法,属性或者索引器;
5.在指定方法时,只需要给出返回类型,名称和参数列表,然后分号结束。
面向对象的接口
在C++中,一个类被允许继承多个类。但是在Java以后的语言不被允许。
这样,如果想继承多个类时便非常困难。所以开发方想出了新办法:接口。
一个接口内,允许包含变量、常量等一个类所包含的基本内容。但是,接口中的函数不允许设定代码,也就意味着不能把程序入口放到接口里。由上可以理解到,接口是专门被继承的。接口存在的意义也是被继承。和C++里的抽象类里的纯虚函数是相同的。不能被实例化。
定义接口的关键字是interface,例如:
publicinterfaceMyInterface{
public void add(int x,int y);
public void volume(int x,int y,int z);
}
继承接口的关键字是implements,相当于继承类的extends。
需要注意的是,当继承一个接口时,接口里的所有函数必须全部被覆盖。例如:
class Demo implements MyInterface{
public void add(int x,int y){
System.out.println( +(x+y));
}
public void volume(int x,int y,int z){
System.out.println( +(x*y*z));
}
public static void main(String args[]){
Demo d=new Demo();
d.add(10,20);
d.volume(10,10,10);
}
}
输出结果:
30
1000
当想继承多个类时,开发程序不允许,报错。这样就要用到接口。因为接口允许多重继承(,),而类不允许。所以就要用到接口。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流