VisualBasicNET从基础到项目实战课件8面向对象编程继承接口与多态
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Class(或Structure)类名(或结构名) Implements 接口1 …… Implements 接口n 具体实现代码
End Class(或End Structure)
在类或者结构内部实现接口中的成员时 也需要使用Implements语句,指明要实 现的接口成员。
接口成员的规范由接口名称(必须在类 或结构名称后的implements语句中指定 )、点号和要实现的成员函数、属性或 事件的名称组成。
2 Inherits Teacher
3 Private proDate As Date
4 Private proSalary As Double
5
6 Public Property EngageDate( ) As Date
7 Get
8
Return proDate
9 End Get
10 Set(ByVal value As Date)
◦ 1 Interface IConnectable
◦2
Function Connect( )As Boolean
◦3
Sub Disconnect( )
◦ 4 End Interface
8.2.3 接口继承
接口可以继承其他接口,因此可以使用接口 来定义层次结构表示实体之间的相互关系。
下面的代码定义了ITimedConnectable接口, 通过引入连接超时的概念扩展了 IConnectable接口。
◦ MustInherite修饰符表示该类必须被继承, 即必须作为基类而不能用于创建实例,必须 作为基类的类有时也被称为抽象类。
8.2 接口
接口与类很相似,也定义了一系列属性 、方法和事件。但与类不同的是,接口 并不提供实现。它们由类来实现,并从 类中被定义为单独的实体。
接口在面向对象设计中发挥着非常重要 的作用,我们可以使用接口来表示一种 约定,实现接口的类必须严格按其定义 来实现接口的每个方面。
例如,定义类DispalayData用于显示不同类型的 数据,可以定义多个重载的Display方法。
1 Class DisplayData 2 Overloads Sub Display(ByVal theChar As Char) 3 End Sub 4 5 Overloads Sub Display(ByVal theInteger As Integer) 6 End Sub 7 8 Overloads Sub Display(ByVal theDouble As Double) 9 End Sub 10 End Class
◦ 5 End Sub ◦ 6 End Class
8.3 多态性
多态就是对象随着程序执行而使其形式发生 改变的能力。派生类在继承基类时,会得到 基类所有的属性,字段和方法。但有时派生 类中定义的特有属性和方法往往与基类中继 承得到的属性和方法同名。
允许在子类中使用与基类的属性或方 法同名的属性及方法,即允许在一个类中, 相同名字的属性或方法能够通过不同的代码 ,完成不同的功能,这样就实现了类的多态 性。
21 End Set
22 End Property
23 End Class
8.1.2 继承控制
还提供NotInheritable和 MustInherite修饰符对继承进行控制。
◦ NotInheritable修饰符表示该类不允许被继 承,即指定该类不能作为基类。不能被继承 的类有时也称为密封类
8.4 使用Me、MyBase和MyClass 关键字
Me关键字提供了一种引用当前正在其中 执行代码的类或结构的特定实例的方法 。Me的行为类似于引用当前实例的对象 变量或结构变量。
在向另一个类、结构或模块中的过程传 递关于某个类或结构的当前执行实例的 信息时,使用Me尤其有用。
MyBase关键字的行为类似于这样的对象 变量:它引用类的当前实例的基类。 MyBase通常用于访问在派生类中被重写 或隐藏的基类成员。例如,MyBase.New 用于从派生类构造函数中显式调用基类 构造函数。
Step1:新建一个Windows Form窗体应 用程序,命名为“BaseForm”。
◦ 1 Interface ITimedConnectable
◦2
Inherits IConnectable
◦3
Sub TimeOut(ByVal millisecs As
Long)
◦ 4 End Interface
8.2.4 实现接口
类和结构都可以用于实现接口,甚至还可以 实现多个接口。使用Implements语句实现接 口的类或结构的语法格式如下。
2 Private teaName As String
3 Private teaBirthDate As Date
4 Private teaNative As String
5
6 Public Property Name( ) As String
7 Get
8
Return teaName
9 End Get
29
teaNative = value
30 End Set
31 End Property
32 End Class
Step3:创建Teacher类的派生类 Professor。可以单击菜单栏中的【项 目】→【添加类】命令来添加一个类, 也可以将该类与Teacher类放在同一个 文件中。
1 Class Professor
8.5 可视化继承
可视化继承是提供的新的继承方 式,一般指的是对窗体的继承。
◦ 在中,窗体本身就是一个类,如果 要实现窗体继承,可以通过生成一个基类 窗体,然后使用Inherits语句就可以在新 窗体中实现对基类窗体的继承。
◦ 这个过程也可以通过可视化编译环境来实 现。
例子
例如,设计一个描述教师的类。
Teacher
Professor
Docent
Assistant
8.1.1 创建派生类
中使用Inherits语句来创建派生 类,该语句使得当前类继承指定类的所 有非私有成员,其基本语法格式如下。
Class 派生类名 Inherits 基类名 类成员 End Class
MyBase关键字用于在派生类中调用基类 的非私有成员,尤其是在需要使用基类 中被派生类隐藏了的方法时MyBase关键 字十分有用。
MyClass关键字的行为类似于这样的对 象变量:它引用最初实现的类的当前实 例。
MyClass类似于Me,但在调用MyClass中 的每个方法和属性时,可将此方法或属 性当作NotOverridable中的方法或属性 对待。因此,方法或属性不受派生类中 重写的影响。
11
proDate = value
12 End Set
13 End Property
14
15 Public Property Salary( ) As Double
16 Get
17
Return proSalary
18 End Get
19 Set(ByVal value As Double)
20
proSalary = value
下面代码中,Manager类重写了其基类Employee类中 的CalSalary方法。
1 Class Employee 2 Public Overridable Function CalSalary( ByVal HoursWorked As Decimal, _ 3 ByVal PayRate As Decimal) As Decimal 4 Return HoursWorked * PayRate 5 End Function 6 End Class 7 8 Class Manager 9 Inherits Employee 10 Private BonusRate As Decimal = 1.5 11 Public Overrides Function CalSalary( ByVal HoursWorked As Decimal, _ 12 ByVal PayRate As Decimal) As Decimal 13 Return HoursWorked * PayRate * BonusRate 14 End Function 15 End Class
下面代码显示了如何声明一个名为Sub1 的用于实现接口方法的子例程。
◦ 1 Class Class1 ◦ 2 Implements interfaceclass.interface2 ◦3 ◦ 4 Sub Sub1(ByVal i As Integer)
Implements interfaceclass.interface2.Sub1
使用重载方法需要注意以下几点
重载成员必须具有不同的特征,下面的 项不能用作区分特征。
应用于成员或成员参数的修饰符,如ByVal或 ByRef。
参数名。 过程的返回类型。
重载时关键字Overloads是可选的,但 如果任一重载成员使用了该Overloads 关键字,则其他所有同名重载成员也必 须指定该关键字。
章节内容
8.1 8.2 8.3 8.4 8.5
继承 接口 多态性 使用Me、MyBase和MyClass关键字 可视化继承
8.1 继承
通过继承,可以直接基于系统中现有的 类创建新类。
现有的类称为基类,也可以称为父类、 超类。
新创建的类称为派生类,也可以称为子 类。
派生类继承了基类中的所有属性、方法 、事件,并且可以对基类进行扩展。
19 Set(ByVal value As Date)
20
teaBirthDate = value
21 End Set
22 End Property
23
24 Public Property Native( ) As String
25 Get
26
Return teaNative
27 End Get
28 Set(ByVal value As String)
10 Set(ByVal value As String)
11
teaName = value
12 End Set
13 End Property
14
15 Public Property BirthDate( ) As Date
16 Get
17
Return teaBirthDate
18 End Get
示例:创建Teacher基类及其 Professor派生类
Step1:新建一个Windows Form应用程 序工程,命名为“ProfessorClass”。
Step2:单击菜单栏中的【项目】→【 添加类】命令,建立一个名为Teacher 的类,作为基类。
下面代码创建了基类Teacher。
1 Public Class Teacher
8.3.2 重载
重写的成员要求与基类成员具有相同的 参数,因此在某些情况下,如需要使用 不同类型或者不同个数的参数完成类似 的功能,重写就不适用了。
这个时候,就要用到重载。重载是在一 个类中用相同的名称但是不同的参数类 型创建一个以上的过程、实例构造函数 或属性。重载的方法使用相同的名字, 但使用不同的参数。
允许使用Interface语句来定义 接口,其基本语法格式如下。
修饰符Interface接口名 Property成员名 Function成员名 Sub成员名 Event成员名 Interface成员名 Class成员名 Structure成员名
End Interface
下面的代码定义了一个接口 IConnectable。
8.3.1 重写
要在派生类中使用与基类类属性或方法 同名但功能不同的属性或方法,一个简 单的方法是把原来基类中定义的属性或 方法覆盖,换成派生类的相关代码,这 称为重写。
具体做法是,基ห้องสมุดไป่ตู้中允许重写的属性和 方法使用关键字Overridable声明,而 在派生类中使用关键字Overrides定义 重写的属性及方法。
何时使用接口?
在应用程序要求很多可能不相关的对象 类型以提供某种功能的情况下,接口的 适用性更强。
接口比类更灵活,因为可以定义单个实 现来实现多个接口。
在无需从基类继承实现的情况下,接口 更好。
在无法使用类继承的情况下接口是很有 用的。例如,结构无法从类继承,但它 们可以实现接口。
8.2.2 定义接口
End Class(或End Structure)
在类或者结构内部实现接口中的成员时 也需要使用Implements语句,指明要实 现的接口成员。
接口成员的规范由接口名称(必须在类 或结构名称后的implements语句中指定 )、点号和要实现的成员函数、属性或 事件的名称组成。
2 Inherits Teacher
3 Private proDate As Date
4 Private proSalary As Double
5
6 Public Property EngageDate( ) As Date
7 Get
8
Return proDate
9 End Get
10 Set(ByVal value As Date)
◦ 1 Interface IConnectable
◦2
Function Connect( )As Boolean
◦3
Sub Disconnect( )
◦ 4 End Interface
8.2.3 接口继承
接口可以继承其他接口,因此可以使用接口 来定义层次结构表示实体之间的相互关系。
下面的代码定义了ITimedConnectable接口, 通过引入连接超时的概念扩展了 IConnectable接口。
◦ MustInherite修饰符表示该类必须被继承, 即必须作为基类而不能用于创建实例,必须 作为基类的类有时也被称为抽象类。
8.2 接口
接口与类很相似,也定义了一系列属性 、方法和事件。但与类不同的是,接口 并不提供实现。它们由类来实现,并从 类中被定义为单独的实体。
接口在面向对象设计中发挥着非常重要 的作用,我们可以使用接口来表示一种 约定,实现接口的类必须严格按其定义 来实现接口的每个方面。
例如,定义类DispalayData用于显示不同类型的 数据,可以定义多个重载的Display方法。
1 Class DisplayData 2 Overloads Sub Display(ByVal theChar As Char) 3 End Sub 4 5 Overloads Sub Display(ByVal theInteger As Integer) 6 End Sub 7 8 Overloads Sub Display(ByVal theDouble As Double) 9 End Sub 10 End Class
◦ 5 End Sub ◦ 6 End Class
8.3 多态性
多态就是对象随着程序执行而使其形式发生 改变的能力。派生类在继承基类时,会得到 基类所有的属性,字段和方法。但有时派生 类中定义的特有属性和方法往往与基类中继 承得到的属性和方法同名。
允许在子类中使用与基类的属性或方 法同名的属性及方法,即允许在一个类中, 相同名字的属性或方法能够通过不同的代码 ,完成不同的功能,这样就实现了类的多态 性。
21 End Set
22 End Property
23 End Class
8.1.2 继承控制
还提供NotInheritable和 MustInherite修饰符对继承进行控制。
◦ NotInheritable修饰符表示该类不允许被继 承,即指定该类不能作为基类。不能被继承 的类有时也称为密封类
8.4 使用Me、MyBase和MyClass 关键字
Me关键字提供了一种引用当前正在其中 执行代码的类或结构的特定实例的方法 。Me的行为类似于引用当前实例的对象 变量或结构变量。
在向另一个类、结构或模块中的过程传 递关于某个类或结构的当前执行实例的 信息时,使用Me尤其有用。
MyBase关键字的行为类似于这样的对象 变量:它引用类的当前实例的基类。 MyBase通常用于访问在派生类中被重写 或隐藏的基类成员。例如,MyBase.New 用于从派生类构造函数中显式调用基类 构造函数。
Step1:新建一个Windows Form窗体应 用程序,命名为“BaseForm”。
◦ 1 Interface ITimedConnectable
◦2
Inherits IConnectable
◦3
Sub TimeOut(ByVal millisecs As
Long)
◦ 4 End Interface
8.2.4 实现接口
类和结构都可以用于实现接口,甚至还可以 实现多个接口。使用Implements语句实现接 口的类或结构的语法格式如下。
2 Private teaName As String
3 Private teaBirthDate As Date
4 Private teaNative As String
5
6 Public Property Name( ) As String
7 Get
8
Return teaName
9 End Get
29
teaNative = value
30 End Set
31 End Property
32 End Class
Step3:创建Teacher类的派生类 Professor。可以单击菜单栏中的【项 目】→【添加类】命令来添加一个类, 也可以将该类与Teacher类放在同一个 文件中。
1 Class Professor
8.5 可视化继承
可视化继承是提供的新的继承方 式,一般指的是对窗体的继承。
◦ 在中,窗体本身就是一个类,如果 要实现窗体继承,可以通过生成一个基类 窗体,然后使用Inherits语句就可以在新 窗体中实现对基类窗体的继承。
◦ 这个过程也可以通过可视化编译环境来实 现。
例子
例如,设计一个描述教师的类。
Teacher
Professor
Docent
Assistant
8.1.1 创建派生类
中使用Inherits语句来创建派生 类,该语句使得当前类继承指定类的所 有非私有成员,其基本语法格式如下。
Class 派生类名 Inherits 基类名 类成员 End Class
MyBase关键字用于在派生类中调用基类 的非私有成员,尤其是在需要使用基类 中被派生类隐藏了的方法时MyBase关键 字十分有用。
MyClass关键字的行为类似于这样的对 象变量:它引用最初实现的类的当前实 例。
MyClass类似于Me,但在调用MyClass中 的每个方法和属性时,可将此方法或属 性当作NotOverridable中的方法或属性 对待。因此,方法或属性不受派生类中 重写的影响。
11
proDate = value
12 End Set
13 End Property
14
15 Public Property Salary( ) As Double
16 Get
17
Return proSalary
18 End Get
19 Set(ByVal value As Double)
20
proSalary = value
下面代码中,Manager类重写了其基类Employee类中 的CalSalary方法。
1 Class Employee 2 Public Overridable Function CalSalary( ByVal HoursWorked As Decimal, _ 3 ByVal PayRate As Decimal) As Decimal 4 Return HoursWorked * PayRate 5 End Function 6 End Class 7 8 Class Manager 9 Inherits Employee 10 Private BonusRate As Decimal = 1.5 11 Public Overrides Function CalSalary( ByVal HoursWorked As Decimal, _ 12 ByVal PayRate As Decimal) As Decimal 13 Return HoursWorked * PayRate * BonusRate 14 End Function 15 End Class
下面代码显示了如何声明一个名为Sub1 的用于实现接口方法的子例程。
◦ 1 Class Class1 ◦ 2 Implements interfaceclass.interface2 ◦3 ◦ 4 Sub Sub1(ByVal i As Integer)
Implements interfaceclass.interface2.Sub1
使用重载方法需要注意以下几点
重载成员必须具有不同的特征,下面的 项不能用作区分特征。
应用于成员或成员参数的修饰符,如ByVal或 ByRef。
参数名。 过程的返回类型。
重载时关键字Overloads是可选的,但 如果任一重载成员使用了该Overloads 关键字,则其他所有同名重载成员也必 须指定该关键字。
章节内容
8.1 8.2 8.3 8.4 8.5
继承 接口 多态性 使用Me、MyBase和MyClass关键字 可视化继承
8.1 继承
通过继承,可以直接基于系统中现有的 类创建新类。
现有的类称为基类,也可以称为父类、 超类。
新创建的类称为派生类,也可以称为子 类。
派生类继承了基类中的所有属性、方法 、事件,并且可以对基类进行扩展。
19 Set(ByVal value As Date)
20
teaBirthDate = value
21 End Set
22 End Property
23
24 Public Property Native( ) As String
25 Get
26
Return teaNative
27 End Get
28 Set(ByVal value As String)
10 Set(ByVal value As String)
11
teaName = value
12 End Set
13 End Property
14
15 Public Property BirthDate( ) As Date
16 Get
17
Return teaBirthDate
18 End Get
示例:创建Teacher基类及其 Professor派生类
Step1:新建一个Windows Form应用程 序工程,命名为“ProfessorClass”。
Step2:单击菜单栏中的【项目】→【 添加类】命令,建立一个名为Teacher 的类,作为基类。
下面代码创建了基类Teacher。
1 Public Class Teacher
8.3.2 重载
重写的成员要求与基类成员具有相同的 参数,因此在某些情况下,如需要使用 不同类型或者不同个数的参数完成类似 的功能,重写就不适用了。
这个时候,就要用到重载。重载是在一 个类中用相同的名称但是不同的参数类 型创建一个以上的过程、实例构造函数 或属性。重载的方法使用相同的名字, 但使用不同的参数。
允许使用Interface语句来定义 接口,其基本语法格式如下。
修饰符Interface接口名 Property成员名 Function成员名 Sub成员名 Event成员名 Interface成员名 Class成员名 Structure成员名
End Interface
下面的代码定义了一个接口 IConnectable。
8.3.1 重写
要在派生类中使用与基类类属性或方法 同名但功能不同的属性或方法,一个简 单的方法是把原来基类中定义的属性或 方法覆盖,换成派生类的相关代码,这 称为重写。
具体做法是,基ห้องสมุดไป่ตู้中允许重写的属性和 方法使用关键字Overridable声明,而 在派生类中使用关键字Overrides定义 重写的属性及方法。
何时使用接口?
在应用程序要求很多可能不相关的对象 类型以提供某种功能的情况下,接口的 适用性更强。
接口比类更灵活,因为可以定义单个实 现来实现多个接口。
在无需从基类继承实现的情况下,接口 更好。
在无法使用类继承的情况下接口是很有 用的。例如,结构无法从类继承,但它 们可以实现接口。
8.2.2 定义接口